Android ActionBar示例教程
今天,我们将研究Android ActionBar。
无论是Web应用程序还是移动应用程序,Action Bar都是任何应用程序的重要组成部分之一。
今天,我们将学习如何使用ActionBar
组件在android应用中实现操作列。
Android ActionBar
Android ActionBar是一个菜单列,它贯穿android中的活动屏幕顶部。
Android ActionBar可以包含菜单项,这些菜单项在用户单击"菜单"按钮时变为可见。
通常," ActionBar"包含以下四个组件:
- 应用程序图标:应用程序品牌徽标或者图标将显示在此处
- 视图控件:用于显示应用程序标题的专用空间。
还提供了通过添加微调器或者选项卡式导航在视图之间切换的选项 - 操作按钮:可以在此处添加应用程序的一些重要操作
- 动作溢出:所有不重要的动作将显示为菜单
Android ActionBar设置
使用主题Theme.Holo或者派生自Theme.Holo的主题的所有活动将自动包含ActionBar。
Android ActionBar菜单
使工具列图标和操作溢出项进入操作列的最简单方法是创建在res/menu文件夹中找到的菜单XML资源文件。
我们可以在文件夹中存在的原始xml文件中添加菜单项,如下所示:
menu_main.xml
<menu xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/add" android:icon="@android:drawable/ic_menu_add" app:showAsAction="always" android:title="@string/add" <item android:id="@+id/reset" android:icon="@android:drawable/ic_menu_revert" app:showAsAction="always|withText" android:title="@string/reset" <item android:id="@+id/about" android:icon="@android:drawable/ic_dialog_info" app:showAsAction="never" android:title="@string/about"> </item> <item android:id="@+id/exit" app:showAsAction="never" android:title="@string/exit"> </item> </menu>
每个菜单项都需要配置四件事。
- android:id:属性指定菜单项的ID。
这就像在Android应用中其他任何地方的ID一样工作。
以@ + id /开头的android:id值将在R.menu常量集合中创建一个常量 - android:title:属性值包含菜单项的标题
- android:icon:属性引用可绘制目录中的图标
- android:showAsAction:此属性指示应如何在操作列中显示给定项目。
我们可以从以下提到的任何标志中进行选择:始终始终将其保留在ActionBar中 - ifRoom仅在有可用空间时保留它
- 从不意味着菜单项不会作为图标放置在ActionBar中。
只有在弹出菜单中单击菜单按钮时,该菜单才会显示 - | withText:我们可以将其附加到always或者ifRoom上,以指示工具列按钮既是图标又是标题,而不仅仅是图标
请注意,始终不能保证始终将其作为工具列按钮-如果您要求提供100个始终项,则将没有空间容纳所有这些项目。
但是,"总是"项在操作列中的空间优先于" ifRoom"项。
将菜单扩展到Android ActionBar
为了显示菜单XML文件中定义的菜单项,您需要给菜单文件充气。
我们在要添加ActionBar的活动的" onCreateOptionsMenu()"方法内执行此操作。
这是代码片段:
@Override public boolean onCreateOptionsMenu(Menu menu) { //Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
R.menu.menu_main参数是引用菜单XML文件的常数。
menu参数是我们要其中添加菜单项的菜单。
响应Android操作列事件
要找出用户何时点击其中一项内容,我们需要从MainActivity中覆盖" onOptionsItemSelected()",如下所示:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.add: //add the function to perform here return(true); case R.id.reset: //add the function to perform here return(true); case R.id.about: //add the function to perform here return(true); case R.id.exit: //add the function to perform here return(true); } return(super.onOptionsItemSelected(item)); }
现在,我们为项目中的每个菜单项分配一些基本功能。
Android ActionBar示例代码
我们已经在MainActivity中实现了四个菜单项,如下面的代码片段所示:
MainActivity.java
package com.theitroad.actionbar; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { TextView count; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { //Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.add: count=(TextView)findViewById(R.id.textView); count.setText("Add is clicked"); return(true); case R.id.reset: count=(TextView)findViewById(R.id.textView); count.setText("Nothing is selected"); return(true); case R.id.about: Toast.makeText(this, R.string.about_toast, Toast.LENGTH_LONG).show(); return(true); case R.id.exit: finish(); return(true); } return(super.onOptionsItemSelected(item)); } }
为项目分配了各自的功能。
所选项目由在" menu_main.xml"文件中定义的ID决定。
其中我们只更改前两个项目中的" TextView"内容,在第三个项目中显示祝酒词,并在第四个项目中退出应用程序。
请注意,AppCompatActivity替代了不推荐使用的ActionBarActivity版本。
styles.xml
文件定义如下:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> </resources>
如您所见,父主题使用Theme.AppCompat的派生类,该派生默认情况下保存一个ActionBar(除非您使用Theme.AppCompat.Light.NoActionBar类)。
因此,无需在此处明确定义它。
Android操作列向后移植
- 由于ActionBar是在Android Honeycomb 3.0之后引入的,因此要在minSdkVersion为11或者更小时实现ActionBar,我们需要将app-compat-v7 jar导入到gradle中,因为我们这样做是为了实现向后兼容
- 另一种方法是使用ActionBarSherlock导入和扩展MainActivity,而独立于操作列的反向端口,因为此类是在Android 3.0之后引入的
下图显示了我们的项目产生的输出,您可以看到ActionBar包含预定义的图标。
自从单击添加图标以来,textview会更新内容。
自单击重置后,文本视图会将内容还原为原始内容。
单击"关于"时,将显示toast通知。