Fragment中添加menu

Fragment是Android里面中一個非常靈巧的設(shè)計偏陪,它可以看做ui模塊锹安,由活動托管褥芒。熟練的使用它們能優(yōu)雅的實現(xiàn)很復(fù)雜的界面,而且用它們編寫UI界面又憨,相對于用一個個Activity所消耗內(nèi)存少得多翠霍,而且切換很流暢锭吨,可以參考知乎客戶端。

但是寒匙,F(xiàn)ragment使用過程中會出現(xiàn)一些小問題零如,這里講如何在Fragment中添加menu。我們都知道在活動中添加menu只用編寫好menu锄弱,在onCreateOptionsMenu中加載考蕾,并在onOptionsItemSelected中處理點擊事件就可以了,按照這個流程先試下

首先編寫menu.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/item_setting"
          android:icon="@drawable/ic_settings"
          android:title="@string/setting"
        app:showAsAction="always"/>
</menu>

這里只添加一個設(shè)置的menu item

然后要加載menu需要toolbar或actionbar会宪,這里分兩種情況:

  1. 用Activity中actionbar或toolbar肖卧,在Fragment中不添加toolbar
    只需在Activity中初始化好標(biāo)題欄(用toolbar時要調(diào)用setSupportActionBar),在fragment中
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main,menu);
        super.onCreateOptionsMenu(menu, inflater);
    }
  1. 去除Activity中標(biāo)題欄掸鹅,在Fragment中添加toolbar
    在fragment中初始化標(biāo)題欄時要注意塞帐,fragment中沒有setSupportActionBar方法,也就是在標(biāo)題欄還是要交給托管其的活動來處理巍沙,標(biāo)題欄最終設(shè)置到window上葵姥,代碼如下
/**
     * Fragment中初始化Toolbar
     * @param toolbar
     * @param title 標(biāo)題
     * @param isDisplayHomeAsUp 是否顯示返回箭頭
     */
    public void initToolbar(Toolbar toolbar, String title, boolean isDisplayHomeAsUp) {
        AppCompatActivity appCompatActivity= (AppCompatActivity) getActivity();
        appCompatActivity.setSupportActionBar(toolbar);
        ActionBar actionBar = appCompatActivity.getSupportActionBar();
        if (actionBar != null) {
            actionBar.setTitle(title);
            actionBar.setDisplayHomeAsUpEnabled(isDisplayHomeAsUp);
        }
    }

然后再調(diào)用onCreateOptionsMenu加載到toolbar上

運行一下,你會發(fā)現(xiàn)兩種情況下menu都沒加載出來句携。原來要在fragment中加載menu還需在其onCreate中加一句 setHasOptionsMenu(true)榔幸,用于讓活動知道有menu要加載

@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

現(xiàn)在menu加載出來了

然后重寫onOptionsItemSelected處理點擊事件

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_setting:
                SettingActivity.start(getContext());
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

現(xiàn)在就大功告成了嗎,然而運行后會發(fā)現(xiàn)無論怎么點擊onOptionsItemSelected都沒被調(diào)用矮嫉∠髋兀可以再android training中找到原因
http://developer.android.com/guide/topics/ui/actionbar.html

Note: If you added the menu item from a fragment, via the Fragment class's onCreateOptionsMenu callback, then the system calls the respective onOptionsItemSelected() method for that fragment when the user selects one of the fragment's items. However the activity gets a chance to handle the event first, so the system calls onOptionsItemSelected() on the activity before calling the same callback for the fragment.

也就是說在雖然在fragment中重寫onOptionsItemSelected,但系統(tǒng)會在activity中先調(diào)用onOptionsItemSelected蠢笋,而活動中默認都消耗了點擊事件拨齐,fragment中因此無法處理點擊。所以要先在托管碎片的活動中講frament中處理的menu item返回false挺尿,讓點擊事件能穿到fragment的onOptionsItemSelected中

@Override
    public boolean onOptionsItemSelected(MenuItem paramMenuItem) {
         switch (paramMenuItem.getItemId()) {
            case R.id.item_setting:
                return false;
            default:
                return super.onOptionsItemSelected(paramMenuItem);
        }
    }

總結(jié)下
要在fragment添加menu需要以下步驟:

  1. 在fragment的onCreate中添加一句 setHasOptionsMenu(true)奏黑;
  2. 如果用的是活動的標(biāo)題欄,只需在onCreateOptionsMenu中加載menu编矾;如果用Fragment自己的toolbar需要先用活動初始化toolbar熟史,然后再onCreateOptionsMenu
  3. 在活動中重寫onOptionsItemSelected,講需要在fragment中處理的menu item直接返回false窄俏,再在fragment的onOptionsItemSelected中處理
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹂匹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凹蜈,更是在濱河造成了極大的恐慌限寞,老刑警劉巖忍啸,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異履植,居然都是意外死亡计雌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門玫霎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凿滤,“玉大人,你說我怎么就攤上這事庶近∥檀啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵鼻种,是天一觀的道長反番。 經(jīng)常有香客問我,道長叉钥,這世上最難降的妖魔是什么罢缸? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮沼侣,結(jié)果婚禮上祖能,老公的妹妹穿的比我還像新娘。我一直安慰自己蛾洛,他們只是感情好养铸,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轧膘,像睡著了一般钞螟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谎碍,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天鳞滨,我揣著相機與錄音,去河邊找鬼蟆淀。 笑死拯啦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熔任。 我是一名探鬼主播褒链,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疑苔!你這毒婦竟也來了甫匹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兵迅,沒想到半個月后抢韭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡恍箭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年刻恭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片季惯。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡吠各,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勉抓,到底是詐尸還是另有隱情,我是刑警寧澤候学,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布藕筋,位于F島的核電站,受9級特大地震影響梳码,放射性物質(zhì)發(fā)生泄漏隐圾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一掰茶、第九天 我趴在偏房一處隱蔽的房頂上張望暇藏。 院中可真熱鬧,春花似錦濒蒋、人聲如沸盐碱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓮顽。三九已至,卻和暖如春围橡,著一層夾襖步出監(jiān)牢的瞬間暖混,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工翁授, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拣播,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓收擦,卻偏偏與公主長得像贮配,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炬守,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容