Android ActionBar

时间:2020-01-09 10:33:59  来源:igfitidea点击:

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文件的外观类似于本文前面所示。