petitviolet blog

    Androidのoptions menuまわりのtips

    2014-11-28

    QiitaJavaAndroid
    • ActionBar メニューの表示/非表示を切り替える
    • Fragment にメニューを表示させる

    ActionBar メニューの表示/非表示を切り替える

    概要

    ActionBarActivityな Activity の ActionBar にあるメニュー(options menu)について、

    MenuItem item = menu.findItem(R.id.menu_id);
    item.setVisible(false);
    

    をしても消えてくれなかった options menu を何とかして消す

    やり方

    activity
    // 初期状態ではmenuを表示させる
    private boolean menuVisible = true;
    private MenuItem menuToggleVisible;
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_activity, menu);
        return true;
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        menuToggleVisible = menu.findItem(R.id.menu_toggle_visible);
        menuToggleVisible.setVisible(menuVisible);
        return true;
    }
    
    private void toggleMenuVisible() {
        menuVisible != menuVisible;
        invalidateOptionsMenu();
    }
    

    このようにonPrepareOptionsMenuの中でsetVisibleを呼び出せるようにしておく そして、invalidateOptionsMenu()によって内部でonPrepareOptionsMenuが call され、 menu の表示/非表示が切り替えられる

    参考

    Fragment にメニューを表示させる

    Activity の上に乗せた Fragment ごとに menu を表示させたい

    やり方

    fragment
    private MenuItem menuItem;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        // ...
    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
        super.onCreateOptionsMenu(menu, menuInflater);
        // menu.add(groupId, itemId, order, title);
        menuItem = menu.add(Menu.NONE, 0, 100, getString(R.string.menu_item));
        menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
    

    まずonCreatesetHasOptionsMenu(true)を call しておく そして、onCreateOptionsMenuで options menu を作成する ここでは Java だけで menu を作成している

    参考

    from: https://qiita.com/petitviolet/items/da5a686556e65a9b5d9a