Android ActionBar
AndroidActionBar
组件是Android应用程序中的顶部菜单栏。此屏幕快照在屏幕快照的顶部显示了一个AndroidActionBar
:
Android的" ActionBar"可以包含菜单项,这些菜单项在用户单击Android手机上的"菜单"按钮或者平板电脑上的" ActionBar"中的"菜单"按钮时显示。平板电脑上的菜单按钮是右上角的"汉堡"图标(彼此下方的三个水平条纹)。
在本文中,我将解释如何将菜单项添加到AndroidActionBar
。我们可以添加菜单项,并确定它们是否应始终在" ActionBar"中可见,是否有空间或者仅在用户单击菜单按钮时显示在菜单中可见。
请注意,从Android 5开始,有一个新的Toolbar
小部件可以执行与ActionBar
相同的功能。从Android 5及更高版本开始,我们可能应该使用Toolbar
而不是ActionBar
。
添加一个ActionBar
所有使用主题" Theme.Holo"或者从" Theme.Holo"派生的主题的活动将自动包含" ActionBar"。我们可以在src / main / res / values / styles.xml中查看应用使用的主题。
将菜单项添加到ActionBar
我们可以在菜单XML文件src / main / res / meny / ???。xml文件中的ActionBar中添加菜单项。菜单文件实际上没有叫做???。xml
。菜单文件通常被称为与其所属的活动相同的文件,但没有"活动"部分。因此,如果菜单所属的活动称为" MyActivity",则菜单文件将命名为" my.xml"。
这是菜单XML文件的示例:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_favourite" android:icon="@drawable/ic_action_favorite" android:title="@string/action_favorite" android:showAsAction="ifRoom" /> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" android:showAsAction="never" /> </menu>
该菜单文件包含两个item
元素。每个item
元素在ActionBar
中定义一个菜单项。第一个item
元素包含4个属性:
- android:id
- android:图标
- android:标题
- android:showAsAction
android:id属性指定菜单项的ID。这就像Android应用中其他任何地方的ID一样工作。以@ + id /
开头的android:id
值将在R.menu
常量集合中创建一个常量。
android:icon属性引用了可绘制目录中的图标。记住为每个屏幕分辨率创建一个图标。我们可以在Android的官方肖像学指南中阅读有关如何操作的更多信息。本指南还包含一个链接,该链接可下载一组我们可以使用的标准图标,因此我们不必自己绘制每个图标。
android:title属性值包含菜单项的标题。在上面的示例中,属性值@ string / action_settings
引用了在src / main / res / values / strings.xml中定义的字符串。
android:showAsAction属性指定菜单项的显示方式。我们可以使用以下值之一:
- 从来没有
ifRoom
ifRoom | withText
collapseActionView
- 总是
值never
表示菜单项在ActionBar中永远不会显示为图标。仅在弹出菜单中单击菜单按钮时,该菜单才会显示。
值" ifRoom"表示菜单项将在" ActionBar"(如果有空间)中显示。不同大小的设备可容纳不同数量的菜单项,因此,如果给定设备在其" ActionBar"中为菜单项留有空间,则将显示菜单项。
值" ifRoom | withText"表示如果有足够的空间,则菜单项应同时显示图标和标题。如果图标和标题都没有空间,则Android将尝试仅显示图标(仅当图标也有空间时才显示)。
我还不完全了解" collapseActionView"值的含义。 Android官方文档中的解释对其含义有点虚弱。
值"始终"表示菜单项应始终显示在操作栏中。
将菜单扩展到操作栏中
为了显示在菜单XML文件中定义的菜单项,我们需要给菜单文件充气。我们可以在要向其中添加" ActionBar"的活动的" onCreateOptionsMenu()"方法内执行此操作。这是一个例子:
public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.my, menu); return super.onCreateOptionsMenu(menu); }
注意对" inflater.inflate(R.menu.my,菜单)"的调用。 R.menu.my参数是引用菜单XML文件的常量。 " menu"参数是要其中添加菜单项的菜单。该参数作为参数从Android传递到onCreateOptionsMenu()。
处理ActionBar项目点击
我们可以响应托管ActionBar的活动的onOptionsItemSelected()方法内的ActionBar菜单项上的单击。这是一个例子:
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_favorite) { // Mark the currently visible content (e.g. article) in the activity as a favorite // - requires app specific code which is omitted here. // Tell Android that the item click has been handled. return true; } return super.onOptionsItemSelected(item); }
此示例首先查看作为参数传递给onOptionsItemSelected()方法的MenuItem的项ID。这个MenuItem
参数代表被点击的菜单项。
如果单击的菜单项的ID等于R.id.action_favorite
(在菜单XML文件中为此菜单项定义的ID),则该应用将执行与"收藏夹"菜单项相关的操作。通常,将执行一些操作,记住主机活动中可见的任何内容都应标记为收藏。此处省略了此代码,因为如何将某事物标记为收藏夹,甚至意味着什么,是特定于执行此操作的应用程序的。
如果项目点击是由应用处理的,则onOptionsItemSelected()方法应返回true。否则,它应该返回super.onOPtionsItemSelected(item)
,为活动类的超类提供处理菜单项单击的机会。
显示和隐藏ActionBar
我们可以使用以下代码在托管活动中的任何位置隐藏" ActionBar":
ActionBar actionBar = getActionBar(); actionBar.hide();
如果" ActionBar"被隐藏,则可以使用以下代码再次显示它:
ActionBar actionBar = getActionBar(); actionBar.show();
getActionBar()方法是从Activity继承的,因此在Activity子类中都可以使用。
完整的ActionBar示例
这是完整的ActionBar示例的代码:
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.my, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
菜单布局XML文件的外观类似于本文前面所示。