【问题标题】:How to change the position of menu items on actionbar如何更改操作栏上菜单项的位置
【发布时间】:2013-04-11 12:42:03
【问题描述】:

我正在开发一个应用程序,我必须在操作栏上添加自定义布局。添加自定义布局已完成,但是当我在操作栏上添加菜单项时,我的自定义布局将其位置从操作栏的右侧更改为操作栏的中心。下图是我目前所取得的成果。

我想在操作栏上显示这样的内容。

自定义布局(黄色按钮)在操作栏的最右侧和中间的菜单项。

添加我的代码以使用本机 android 操作栏实现此自定义布局:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    actionBar = getActionBar();
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayUseLogoEnabled(false);
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    cView = getLayoutInflater().inflate(R.layout.header, null);
    actionBar.setCustomView(cView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.websearch_menu, menu);
    return true;

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:
        finish();

    default:
        return super.onOptionsItemSelected(item);
    }
}

如何做到这一点?

我们将不胜感激。

【问题讨论】:

    标签: android android-layout android-actionbar menuitem


    【解决方案1】:

    只需在您的 xml 文件中使用orderInCategory,它就会从小到大排序(从操作栏的左侧开始)。如:

    <item
        android:id="@+id/Refresh"
        android:icon="@drawable/ic_action_refresh"
        android:showAsAction="ifRoom"
        android:title="@string/refresh"
        android:orderInCategory="2"/>
    <item
        android:id="@+id/Search"
        android:icon="@drawable/ic_action_action_search"
        android:showAsAction="ifRoom|collapseActionView"
        android:title="@string/search"
        android:orderInCategory="1"/>
    

    尽管 Refresh 项在 xml 文件中排在第一位,但它不会排在第一位。但是,根据其 orderInCategory 属性,您的操作栏中从左到右的 Search 图标将排在第一位。

    【讨论】:

      【解决方案2】:

      我假设您将自定义视图设置为操作栏中的自定义视图。如果您使用的是 ActionbarSherlock,您可以将自定义视图添加为普通菜单项,并使用 .setActionView(yourCustomView or yourCustomLayoutId) 为其设置操作视图。然后您可以设置.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) 来显示视图。只需确保您的自定义视图设置为宽度wrap_content,否则它将把其他菜单项推离屏幕。这可能在没有 ActionbarSherlock 的情况下也可以工作,但我还没有尝试过。

      编辑:尝试修改您的 onCreateOptionsMenu 方法

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.websearch_menu, menu);
      
          // add this
          menu.add(Menu.NONE, 0, Menu.NONE, "custom")
              .setActionView(R.layout.header)
              .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      
          return true;
      }
      

      并从您的 onCreate 方法中删除它

      actionBar.setDisplayShowCustomEnabled(true);
      cView = getLayoutInflater().inflate(R.layout.header, null);
      actionBar.setCustomView(cView);
      

      编辑:

      如果您需要从自定义布局中引用视图,您可以在您的 onCreateOptionsMenu 方法中执行此操作,如下所示(注意:我在浏览器中编写了此代码,因此不能保证我没有打错或东西):

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
      
          // inflate the menu and add the item with id viewId,
          // which has your layout as actionview
      
          View actionView = menu.getItem(viewId).getActionView();
          View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout);
      
          // here you can set listeners to your view or store a reference 
          // to it somewhere, so you can use it later
      
          return true;
      }
      

      【讨论】:

      • 我已经添加了如何使用ActionbarSherlock执行此操作的代码,我希望它与默认的Actionbar相同
      • 你太棒了,伙计。非常感谢,您让我免于创建一个完整的自定义布局,然后将其膨胀到操作栏。谢谢!
      • @Thrakbad 它如何准确地改变 actionBar 上项目的顺序?我不明白。
      • @Thrakbad 我们可以从左边给菜单项留一些边距,让它完全位于操作栏的中间吗?
      • @androiddeveloper 项目只是从左到右添加的,所以最后添加的项目是最右边的(溢出菜单除外)
      【解决方案3】:

      菜单项的顺序将根据它们在膨胀的 XML 文件中的顺序进行设置。

      因此,您只需随意更改 XML 文件中的顺序即可。

      【讨论】:

        【解决方案4】:

        实现它的一种方法是调用invalidateOptionMenu 并在onCreateOptionsMenu 方法中,按照您希望放置它们的顺序放置项目。

        顺便说一句,如果你使用 ActionBarSherlock,这个方法是可用的,所以忽略关于它的 Lint 警告。

        【讨论】:

        • 你能指导我如何实现这一目标吗?任何类型的代码都会对我有所帮助。
        • 是的,无论您想在哪里更改项目的顺序,保存项目顺序的配置,然后调用 invalidateOptionMenu() 。然后,在 onCreateOptionsMenu() 方法中,检查您存储的配置,并使用循环,按顺序检查您希望插入的所有项目,并动态地将它们一一添加到菜单中。您应该通过访问 onCreateOptionsMenu() 的“菜单”变量来完成。如果您希望使用 inflate 包含“静态”操作项,那没关系,只需找到将其余内容放入菜单本身的确切位置即可。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 2012-04-13
        • 1970-01-01
        • 2014-01-20
        相关资源
        最近更新 更多