Android 由于片段和活动层次结构而导致的菜单顺序差异。(OnCreateOptions菜单)

Android 由于片段和活动层次结构而导致的菜单顺序差异。(OnCreateOptions菜单),android,android-activity,menu,android-fragments,Android,Android Activity,Menu,Android Fragments,背景 为Android 3.0开发,我有一个HostActivity,它是NoteBookActivity和NoteActivity的超类NotebooksActivity包括一个片段,NotebooksFragment 在HostActivity中,我在操作栏的选项菜单的最右端包含了一个菜单,即HostActivity子类中的所有菜单项应显示在HostActivity中添加的菜单项的左侧 @Override public void onCreateOptionsMenu(Menu menu,

背景

为Android 3.0开发,我有一个
HostActivity
,它是
NoteBookActivity
NoteActivity
的超类
NotebooksActivity
包括一个片段,
NotebooksFragment

HostActivity
中,我在操作栏的选项菜单的最右端包含了一个菜单,
HostActivity
子类中的所有菜单项应显示在
HostActivity
中添加的菜单项的左侧

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.notebooks_menu, menu);
    SearchView sv = new SearchView(getActivity());
    sv.setOnQueryTextListener(this);
    menu.findItem(R.id.search_notebooks).setActionView(sv);

    super.onCreateOptionsMenu(menu, inflater);
}
主机活动中的菜单膨胀:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    final MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.host_menu, menu);
    return super.onCreateOptionsMenu(menu);
}
问题

当我在
NoteActivity
中添加菜单项时,我达到了预期的顺序:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.notebook_menu, menu);
    return super.onCreateOptionsMenu(menu);
}
但是,当我在
NotebooksFragment
中添加菜单项时,由于片段的工作方式,在
HostActivity
中的相同方法之后调用了
oncreateoptions菜单项,导致
HostActivity
的菜单项出现在
NotebooksFragment
之前。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.notebooks_menu, menu);
    SearchView sv = new SearchView(getActivity());
    sv.setOnQueryTextListener(this);
    menu.findItem(R.id.search_notebooks).setActionView(sv);

    super.onCreateOptionsMenu(menu, inflater);
}

如何实现所需的菜单排序?

您可以尝试使用
android:menuCategory
android:orderInCategory
更手动地指定您的排序


或者,在
HostActivity
中使用
onPrepareOptions菜单()
,正如在
onCreateOptions菜单()之后调用的那样。缺点是每次按下菜单按钮时都会调用它,而不仅仅是第一次。

我尝试了onPrepareOptionsMenu()方法,结果成功了。然而,由于某种原因,它在我的Xoom上被调用了两次,因此我不得不添加一些额外的代码来防止重复。我使用
android:menuCategory
android:orderInCategory
解决了这个问题。我尝试通过代码添加片段菜单项,但没有成功,因此我被迫使用XML菜单:(对我来说,将
android:menuCategory=“secondary”
添加到活动项就足够了,这些活动项应该显示在mehu的末尾。不需要额外的排序属性。