搜尋此網誌

2015年9月1日 星期二

【Android】Different Fragments using different / common menu in Action Bar

ref:
http://stackoverflow.com/a/30556508
http://stackoverflow.com/a/18714611
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1120/2025.html

今天想要在不同的fragment使用特定的menu item,但有些menu item是可以共用。

1.建立一個通用menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context=".MainActivity">
    <group
        android:id="@+id/main_menu_group">
        <item
            android:id="@+id/action_refresh"
            android:icon="@drawable/ic_refresh"
            android:orderInCategory="90"
            android:title="@string/action_refresh"
            app:showAsAction="ifRoom"/>

        <item
            android:id="@+id/action_settings"
            android:orderInCategory="100"
            android:title="@string/action_settings"
            app:showAsAction="never"/>
    </group>
</menu>

先把需要通用的menu item寫在<group>外,至於範例是想製造每個fragment呈現不同的menu item。

2.建立特定的menu - menu_f1.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search"
        android:imeOptions="actionSearch"
        android:inputType="textCapWords"
        android:orderInCategory="80"
        android:title="search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/>
</menu>

3.在需要擁有特定menu item的fragment的onCreateView
增加setHasOptionsMenu(true);
來告知這個fragment有另外的OptionsMenu(參考)

4.建立onCreateOptionsMenu(Menu menu, MenuInflater inflater) method,並在onCreateOptionsMenu  引用(inflate)特定的menu,並把通用的menu item顯示設為false。如下所示:
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.menu_air, menu);

        menu.setGroupVisible(R.id.main_menu_group, false);
//        menu.findItem(R.id.action_settings).setVisible(false);
//        menu.findItem(R.id.action_refresh).setVisible(false);
        
        super.onCreateOptionsMenu(menu, inflater);

    }


  • 透過1.設定group的方式,將group內的menu item設為不顯示。
  • 或者是用menu.findItem(R....).setVisible(false);將個別menu item設為不顯示。
改寫在activity中實作的【Android】實作SearchView / Search widget是。如果在fragment中實作,會是如何?差別不太大,有興趣的比較看看:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.menu_air, menu);

        menu.setGroupVisible(R.id.main_menu_group, false);
//        menu.findItem(R.id.action_settings).setVisible(false);
//        menu.findItem(R.id.action_refresh).setVisible(false);
        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                mAdapter.setSearchPattern(s);
                return true;
            }
        });
        super.onCreateOptionsMenu(menu, inflater);

    }
end...

沒有留言: