2017-09-30 5 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. 無効メニュー

    例:

    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%の精度で問題を解決する方法です。我々は実行時のメニュー項目を変更する必要がある場合は文書によると、システムがonCreateOptionsMenuを呼び出した後onCreateOptionsMenu(メニューメニュー)

    を使用して代わりにonPrepareOptionsMenu(メニューメニューに)メソッドを使用することをお勧めします

    ()を呼び出すと、メニューのインスタンスが保持され、何らかの理由でメニューが無効化されない限り、onCreateOptionsMenu()は再び呼び出されません。ただし、onCreateOptionsMenu()は、初期メニュー状態を作成する場合にのみ使用し、アクティビティライフサイクル中は変更しないようにしてください。

    アクティビティライフサイクルで発生するイベントに基づいてオプションメニューを変更する場合は、onPrepareOptionsMenu()メソッドで変更できます。このメソッドは、現在存在するようにMenuオブジェクトを渡します。そのため、アイテムの追加、削除、無効化などの変更が可能です。 (フラグメントも。onPrepareOptionsMenu()コールバックを提供)--Official Android Documentation--

    アプリがバックグラウンドから来ているときに我々は、onResume()refreash股関節ビューのメソッド内invalidateOptionsMenu()を呼び出す必要があります。

    @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; 
        } 
    
    関連する問題