2017-09-30 30 views
1

我都嘗試onCreateOptionsMenu(菜單菜單)onPrepareOptionsMenu(菜單菜單)方法,但是當應用程序在後臺打開我不能改變圖標visibility.As更改菜單圖標我想我需要在內調用這些方法onResume()當應用程序來自於背景(在的onResume()方法)

當應用程序第一次啓動時它按預期工作。

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

     // show manu items if not ofline mode 
     if (Utils.checkNetworkStatus(ExampleActivity.this)) { 
      menu.findItem(R.id.edit).setVisible(true); 
      menu.findItem(R.id.delete).setVisible(true); 
     }else { 
      menu.findItem(R.id.edit).setVisible(false); 
      menu.findItem(R.id.delete).setVisible(false); 
     } 
     return true; 
    } 



@Override 
public boolean onPrepareOptionsMenu(Menu menu){ 

    if (Utils.checkNetworkStatus(ExampleActivity.this)) { 
     menu.findItem(R.id.edit).setVisible(true); 
     menu.findItem(R.id.delete).setVisible(true); 
    }else { 
     menu.findItem(R.id.edit).setVisible(false); 
     menu.findItem(R.id.delete).setVisible(false); 
    } 
    return true; 
} 
+0

使用'invalidateoptionsmenu()'如果你正在改變這些掛鉤外的菜單採取行動 – nomag

+1

,您可能需要調用'invalidateOptionsMenu()'。你試過了嗎? – Jon

+1

我認爲[此鏈接](https://developer.android.com/guide/topics/ui/menus.html#ChangingTheMenu)會幫助你。 –

回答

1

,如果你需要動態地修改你的菜單項目按照這個過程:

  1. 獲取到你的菜單項的引用您創建菜單
  2. 改變這些項目在你的生命週期中的狀態後,方法
  3. 無效菜單

實施例:

private MenuItem editMenuItem, deleteMenuItem; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    editMenuItem = menu.findItem(R.id.edit).setVisible(true); 
    deleteMenuItem = menu.findItem(R.id.delete).setVisible(true); 
    return true; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    boolean online = Utils.checkNetworkStatus(ExampleActivity.this); 
    if (editMenuItem != null){ 
     editMenuItem.setVisible(online); 
    } 

    if (deleteMenuItem != null){ 
     deleteMenuItem.setVisible(online); 
    } 
    invalidateOptionsMenu(); 
    // or supportInvalidateOptionsMenu(); 
} 
2

謝謝@jon和@Oliver Adam的回答。

它指引我到最後的解決方案。這是我如何以100%的準確度解決問題。

據,如果我們需要在運行時更改菜單項的文件,建議使用onPrepareOptionsMenu(菜單菜單)方法,而不是使用onCreateOptionsMenu(菜單菜單)

系統調用onCreateOptionsMenu後(),它會保留您填充的菜單實例,並且不會再次調用onCreateOptionsMenu(),除非菜單由於某種原因而失效。但是,您應該只使用onCreateOptionsMenu()來創建初始菜單狀態,而不是在活動生命週期中進行更改。

如果要根據活動生命週期中發生的事件修改選項菜單,可以在onPrepareOptionsMenu()方法中執行此操作。該方法將當前存在的Menu對象傳遞給您,以便您可以對其進行修改,例如添加,刪除或禁用項目。 (片段也提供了一個onPrepareOptionsMenu()回調。)--Official Android Documentation--

我們需要調用invalidateOptionsMenu()的onResume()用於refreash塔圖方法中,當應用程序來自於背景。

@Override 
protected void onResume() { 
    super.onResume(); 

    invalidateOptionsMenu(); 
} 


@Override 
    public boolean onPrepareOptionsMenu(Menu menu){ 
    if (Utils.checkNetworkStatus(ExampleActivity.this)) { 
     menu.findItem(R.id.edit).setVisible(true); 
     menu.findItem(R.id.delete).setVisible(true); 
    }else { 
     menu.findItem(R.id.edit).setVisible(false); 
     menu.findItem(R.id.delete).setVisible(false) 
    } 
    return true; 
    } 
相關問題