Android 菜单项可见性在运行时发生变化

问题描述 投票:0回答:4

我试图在运行的后台执行任务时隐藏操作栏菜单项一段时间

activity

首先在活动的

onPrepareOptionsMenu
方法中,我将
MenuItem
实例作为字段检索。

public void onPrepareOptionsMenu(final Menu menu) {
    super.onPrepareOptionsMenu(menu);
    // Retrieve and show the contextual settings menu item
    mContextualSettings = menu.findItem(R.id.item_menu_contextual_settings);
    mContextualSettings.setVisible(true);
}

后来我使用该字段使其不可见并再次可见(通过使用 setVisible 方法)。

我想知道这是否是一个好方法,或者我应该以某种方式使用

invalidateOptionsMenu()
使其再次可见?我会遇到空指针异常吗?

谢谢。

android exception android-actionbar android-menu
4个回答
2
投票

我将 MenuItem 实例作为字段检索。 [...] 我想知道这是否是一个好方法,或者我应该以某种方式使用 invalidateOptionsMenu() 使其再次可见?

这不是推荐的方法来完成您正在尝试的操作。您最好使用

supportInvalidateOptionsMenu()
触发
onPrepareOptionsMenu()
并使用
boolean
字段或方法进行检查,然后直接设置项目的可见性。

我会遇到空指针异常吗?

在最新版本的 Android 中,可以在通过

onPrepareOptionsMenu()
膨胀
Menu
之前调用
onCreateOptionsMenu()
。因此,您应该始终对
menu.findItem()
的结果执行空检查,或者以其他方式防止这种情况(也许通过检查
menu.getSize() > 0
是否存在)。


0
投票
        // instance variable
        public Menu option_Menu

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_container, menu);
    option_Menu = menu;
    option_Menu.findItem(R.id.skip).setVisible(false);      
    return super.onCreateOptionsMenu(menu);
    }

    // when task is completed you can show your menu just by calling this method
    public void setMenuVisible(boolean visible, int id) {
    if (option_Menu != null) {
    option_Menu.findItem(id).setVisible(visible);
    }
}

0
投票

因为

supportInvalidateOptionsMenu
现在是
deprecated
。您可以有一个可见性切换字段。调用
invalidateOptionsMenu
触发
onCreateOptionsMenu
,然后切换那里的可见性。

 boolean isVisible = false;

 public void onPrepareOptionsMenu(final Menu menu) {
    super.onPrepareOptionsMenu(menu);
    // Retrieve and show the contextual settings menu item
    mContextualSettings = menu.findItem(R.id.item_menu_contextual_settings);
    mContextualSettings.setVisible(isVisible);
 }

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    isVisible = toggleVisibility(); // logic that determines the visibility
    getActivity().invalidateOptionsMenu()
 }

-1
投票

用这个方法

MenuItem menuItem = menu.findItem(R.id.menu_done);      
menuItem.setVisible(true); //visible
menuItem.setVisible(false); //gone
return true;`
© www.soinside.com 2019 - 2024. All rights reserved.