8

我在设置一些片段菜单项时遇到了问题ActionBar,我找到了解决它的方法,但我不明白为什么它会起作用。

我想在onCreateOptionsMenu方法中从菜单 xml 文件中膨胀菜单项后立即更改菜单项的可见性。该代码似乎工作正常,但没有明显的效果。我解决了在方法中膨胀菜单onCreateOptionsMenu但在方法中改变它的可见性的问题onPrepareOptionsMenu

我想知道的是为什么改变可见性onCreateOptionsMenu不起作用。

我能做什么onPrepareOptionsMenu我不能做onCreateOptionsMenu什么?

这里有什么模式可以遵循吗?

谢谢!

以下是相关代码,以防万一:

public class MyFragment extends Fragment {

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.my_menu, menu);

        // This does not work, compiles and runs fine, but has no visible effect
        MenuItem someMenuItem = menu.findItem(R.id.some_menu_item);
        someMenuItem.setVisible(false);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        // This does work
        MenuItem someMenuItem = menu.findItem(R.id.some_menu_item);
        someMenuItem.setVisible(false);
    }
}
4

4 回答 4

6

您应该super.onCreateOptionsMenu(menu, inflater);在创建菜单后调用,而不是之前调用。这会将菜单在层次结构和其他片段中向上发送,或者活动可能想要自己添加项目。

活动负责显示和管理菜单,因此如果您在将其发送到活动后更改可见性,则不会发生任何事情。

现在,当您调用super.onPrepareOptionsMenu(menu);它时,它会“准备”它的菜单,但它现在会考虑您在其中所做的更改onCreateOptionsMenu

于 2014-09-17T15:08:25.487 回答
0

可能代码应该返回 true 以使菜单可见,这意味着您应该将 return true;语句放在onCreateOptionsMenu()andonPrepareOptionsMenu()中。

希望这可以帮助。

于 2012-08-16T14:15:41.127 回答
0

我使用 onPrepareOptionsMenu 来更新菜单上的哪些项目应该处于活动状态,哪些项目应该灰显/删除,具体取决于活动的当前状态。使用菜单项的 setVisible 方法来控制它当前是否显示在菜单上。

于 2013-11-30T23:23:55.163 回答
-2

这对我有用

public class ContentFragment extends android.support.v4.app.Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.content_frame,container,false);
    setHasOptionsMenu(true);
    return v;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.note_menu,menu);
    super.onCreateOptionsMenu(menu, inflater);
}
}

试试看

于 2016-06-20T09:48:27.317 回答