Android MenuItem setVisible

问题描述:

我想隐藏/显示menuItem,但得到NPE。它在onPrepareOptionsMenu中工作,但不在onCreate中。默认情况下,它应该是不可见的。Android MenuItem setVisible

例如在我的片段的onCreate我想这样做:

if (condition) menuItem.setvisible(true); 

,但它让我NPE上菜单项。

活动

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    getMenuInflater().inflate(R.menu.inventory_list_toolbar, menu); 
    return true; 
} 

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

    mToolbar = findViewById(R.id.inventory_list_toolbar); 
    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
} 

片段:

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

@Override 
public void onPrepareOptionsMenu(Menu menu){ 
    super.onPrepareOptionsMenu(menu); 
    menuItem = menu.findItem(R.id.inventory_list_menu_add); 
    menuItem.setVisible(false); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

private Menu menu; 

对其进行初始化为

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. 
this.menu = menu; 
getMenuInflater().inflate(R.menu.main, menu); 
return true; 
} 

当u要隐藏/显示菜单使用

if(menu != null){ 
MenuItem item_up = menu.findItem(R.id.action_up); 
item_up.setVisible(true); 
} 
+0

请给你的答案添加一些解释。 – ivaigult

+0

声明菜单菜单;'然后将其初始化为@Override public boolean onCreateOptionsMenu(Menu menu){充气菜单;这会将项目添加到操作栏(如果存在)。 this.menu =菜单; getMenuInflater()。inflate(R.menu.main,menu); 返回true; } 如果你想隐藏/显示菜单,使用 if(menu!= null)MenuItem item_up = menu.findItem(R.id.action_up); item_up.setVisible(true); item_up.setVisible(true); } –

+0

@AkshayChopde:编辑答案的解释,不要将它添加为注释 –

您不能从onCreate方法隐藏菜单,因为它尚未充气。

你应该让你的逻辑在onPrepareOptionsMenu方法:

@Override 
public void onPrepareOptionsMenu(Menu menu) { 

    if (condition) { 
     // do what you want 
     MenuItem menuItem = menu.findItem(R.id.menu_item_id); 
     menuItem.setvisible(true); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

否则,把你的逻辑onCreateOptionsMenu方法,并呼吁invalidateOptionsMenu()当你需要刷新的东西。

+0

是的,我做了它在我的片段,它正在工作,但它不是从任何其他方法工作。以及如何使onPrepareOptionsMenu布尔在碎片? – fkvestak

+0

我编辑了我的答案,你不能让它返回一个布尔值,因为它返回void。你有没有试图调用'invalidateOptionsMenu()'? – lubilis

+0

yes,getActivity()。invalidateOptionsMenu();无论我在哪里,我都会得到NPE。并在onPrepare我不能返回任何东西,它是无效的,它在片段 – fkvestak