如何更改操作栏上菜单项的位置

时间:2013-04-18 11:57:47

标签: android android-layout android-actionbar menuitem

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

Done till here

我在动作栏上想要这样的东西。

Like this

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

使用原生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);
    }
}

如何实现这一目标?

任何形式的帮助都将受到赞赏。

4 个答案:

答案 0 :(得分:14)

只需在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"/>

尽管刷新项目首先出现在xml文件中,但它不会是第一个。但是,操作栏中从左到右的搜索图标将首先根据其orderInCategory属性。

答案 1 :(得分:3)

我假设您将自定义视图设置为操作栏中的自定义视图。如果您使用的是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;
}

答案 2 :(得分:2)

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

因此,您需要做的就是根据需要更改XML文件中的顺序。

答案 3 :(得分:0)

实现目标的一种方法是致电invalidateOptionMenu,在onCreateOptionsMenu方法中,根据您希望的顺序放置项目。

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