2017-10-09 57 views
0

我想隱藏/顯示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); 
} 

回答

0
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:編輯答案的解釋,不要將它添加爲註釋 –

1

您不能從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