这个问题在 SO 和其他地方被问过很多次。例如:
ActionBar中的onNavigationItemSelected在启动时被调用如何避免它?
使用 onNavigationItemSelected 和 invalidateOptionsMenu 时的无限循环
在 ActionBar 上使用 onNavigationItemSelected 的活动循环
一些答案和评论建议忽略(某些)回调。这适用于非常简单的用途,但它忽略了这样一个事实,即大多数问这个问题的人想要一个菜单,而不是标准 ActionBar 在列表模式下提供的基于微调器的选项卡式导航。一些评论建议使用 PopupMenu,但我没有看到提供详细信息。所以这里是做什么:
创建将在 ActionBar 中显示的视图,用户将在其上单击以查看菜单:
View view = this.getLayoutInflater().inflate(R.layout.actionbar_view, null);
创建一个锚定到该视图的 PopupMenu:
PopupMenu popup = new PopupMenu(this, view);
popup.getMenuInflater().inflate(R.menu.actionbar_menu, popup.getMenu());
OnClickListener
在显示 PopupMenu 的视图中添加一个:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popup.show();
}
});
向 PopupMenu添加一个OnMenuItemClickListener
以在用户从菜单中选择时接收通知:
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
});
最后,使用以下内容在您的 Activity 中配置 ActionBar:
ActionBar ab = this.getActionBar();
ab.setCustomView(view);
ab.setDisplayShowCustomEnabled(true);
ab.setDisplayShowTitleEnabled(false);
一条评论是,让主视图的样式与默认的 ActionBar 匹配可能有点棘手。尝试调查以下样式资源:
@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title
@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse
@android:style/TextAppearance.Holo.Widget.ActionBar.Title
@android:style/TextAppearance.Holo.Widget.ActionBar.Title.Inverse
否则,您至少需要正确的颜色和可能中等的文本大小。视图本身显然应该fill_parent
具有center_vertical
重力。
'纳夫说。