Material Design ( 2 ) - Toolbar

首發(fā)于我的博客,轉(zhuǎn)載請注明作者和原文鏈接听盖。

在Material Design中杨拐,推薦使用Toolbar代替之前3.0中的Actionbar棕所,以提供更靈活的視圖展現(xiàn)。
使用AppCompatActivity.setSupportActionBar(Toolbar)之后辨宠,Toolbar就可以接管Actionbar的功能遗锣,例如option menu。
實質(zhì)上繼承于ViewGroup嗤形,可以在標(biāo)題欄上顯示任意內(nèi)容,寬高也可以任意設(shè)置赋兵。

同時也預(yù)先提供了一些設(shè)置項:

設(shè)置導(dǎo)航按鈕(Navigation Button):

app:navigationIcon=""
toolbar.setNavigationIcon();
getSupportActionBar().setHomeAsUpIndicator();

設(shè)置Logo(Logo):

app:logo=""
toolbar.setLogo();
getSupportActionBar().setLogo();

設(shè)置標(biāo)題(Title):

app:title=""
toolbar.setTitle();
getSupportActionBar().setTitle();

設(shè)置副標(biāo)題(Subtitle):

app:subtitle=""
toolbar.setSubtitle();
getSupportActionBar().setSubtitle();

如果想要系統(tǒng)默認(rèn)的返回圖標(biāo):

XML:

app:navigationIcon="?attr/homeAsUpIndicator"

Java:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

XML布局:activity_toolbar.xml

下面兩種方式还最,在表現(xiàn)形式上有一點點區(qū)別,作為AppBarLayout的子View時毡惜,在Toolbar的下方會有一條陰影拓轻。

方式一:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">
    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        android:id="@+id/toolbar">
    </android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>

方式二:

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="?android:attr/actionBarSize"
    android:background="?colorPrimary"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    android:id="@+id/toolbar">
</android.support.v7.widget.Toolbar>

有幾點特別說明:

  • app:theme設(shè)置Toolbar的樣式。
  • app:popupTheme設(shè)置Toolbar的菜單彈窗的樣式经伙。

一般來講扶叉,View是不能設(shè)置theme的,但是Google提供了一部分特殊的ThemeOverlay樣式帕膜,這些主題可以給View設(shè)置theme枣氧。
上面設(shè)置給theme和popupTheme的兩個style定義自styles.xml中:

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

提供Toolbar黑底白字的樣式,Toolbar菜單彈窗白底黑字的樣式垮刹。

在Activity中使用:ToolbarActivity

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_toolbar);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

在Fragment中使用:ToolbarFragment

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.activity_toolbar, container, false);

    Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

    return rootView;
}

Options Menu

在res下創(chuàng)建menu目錄达吞,再創(chuàng)建toolbar.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=".toolbar.ToolbarActivity">
    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never" />
</menu>

在Activity中創(chuàng)建Options Menu

創(chuàng)建Toolbar的Options Menu,以及監(jiān)聽Options Menu的點擊事件荒典。
如果調(diào)用過setSupportActionBar(toolbar);酪劫,那就只需要重寫下面的方法:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.toolbar, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
        default:
            break;
    }

    return super.onOptionsItemSelected(item);
}

在Fragment中創(chuàng)建Options Menu

如果想讓Fragment中的onCreateOptionsMenu生效必須先調(diào)用setHasOptionsMenu方法。

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

同樣寺董,已經(jīng)設(shè)置過setSupportActionBar(toolbar);覆糟,重寫如下方法:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.toolbar, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().finish();
            return true;
        default:
            break;
    }

    return super.onOptionsItemSelected(item);
}

注意

  • 導(dǎo)航按鈕的id

    設(shè)置導(dǎo)航圖標(biāo)(NavigationIcon/HomeAsUpIndicator),其默認(rèn)id就是android.R.id.home遮咖。

  • menu重復(fù)顯示

    系統(tǒng)會先執(zhí)行Activity中的onCreateOptionsMenu滩字,再執(zhí)行Fragment中的onCreateOptionsMenu。

    如果Fragment和Activity都同時inflate了一個menu資源文件御吞,那么menu資源所包含的菜單會出現(xiàn)兩次麦箍。

    一開始,在activity中menu是空的陶珠,當(dāng)調(diào)用了getMenuInflater().inflate(R.menu.main, menu)挟裂,menu中便有了菜單項。

    而在執(zhí)行到Fragment的(Menu menu, MenuInflater inflater)時背率,activity的menu就傳遞下來话瞧,作為第一個參數(shù)嫩与。

    activity和Fragment中的menu其實是一個對象寝姿。

    那么當(dāng)存在一個Activity和多個Fragment交排,但又想顯示不同的Options Menu時,可以在Fragment的onCreateOptionsMenu中調(diào)用menu.clear();饵筑。

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.toolbar, menu);
    }
    
  • menu事件重復(fù)響應(yīng)

    menu.clear()可以解決inflate同一個menu資源文件時埃篓,重復(fù)顯示的問題。

    但是如果Activity和Fragment都對該menu響應(yīng)的話根资,就會執(zhí)行兩次響應(yīng)事件架专。

    事件的執(zhí)行順序同樣是顯示執(zhí)行Activity的onOptionsItemSelected,再執(zhí)行Fragment的onOptionsItemSelected玄帕。

    所以部脚,如果業(yè)務(wù)上Activity具有更高的優(yōu)先級,可以通過return true;裤纹,攔截試圖傳遞到Fragment的事件委刘。

    但是如果Fragment具有更高的優(yōu)先級的,就無解了鹰椒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锡移,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漆际,更是在濱河造成了極大的恐慌淆珊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奸汇,死亡現(xiàn)場離奇詭異施符,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擂找,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門操刀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婴洼,你說我怎么就攤上這事骨坑。” “怎么了柬采?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵欢唾,是天一觀的道長。 經(jīng)常有香客問我粉捻,道長礁遣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任肩刃,我火速辦了婚禮祟霍,結(jié)果婚禮上杏头,老公的妹妹穿的比我還像新娘。我一直安慰自己沸呐,他們只是感情好醇王,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崭添,像睡著了一般寓娩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呼渣,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天棘伴,我揣著相機(jī)與錄音,去河邊找鬼屁置。 笑死焊夸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蓝角。 我是一名探鬼主播阱穗,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帅容!你這毒婦竟也來了颇象?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤并徘,失蹤者是張志新(化名)和其女友劉穎遣钳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麦乞,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蕴茴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姐直。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦淀。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖声畏,靈堂內(nèi)的尸體忽然破棺而出撞叽,到底是詐尸還是另有隱情,我是刑警寧澤插龄,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布愿棋,位于F島的核電站,受9級特大地震影響均牢,放射性物質(zhì)發(fā)生泄漏糠雨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一徘跪、第九天 我趴在偏房一處隱蔽的房頂上張望甘邀。 院中可真熱鬧琅攘,春花似錦、人聲如沸松邪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽测摔。三九已至置济,卻和暖如春解恰,著一層夾襖步出監(jiān)牢的瞬間锋八,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工护盈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留挟纱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓腐宋,卻偏偏與公主長得像紊服,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胸竞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 總結(jié) Fragment初始化用newInstance viewPager開多Fragment, 考慮懶加載 get...
    我不是死胖子閱讀 734評論 0 4
  • ActionBar和ToolBar Action Bar是Android 3.0引入的導(dǎo)航欄功能欺嗤,然而到5.0的時...
    Cris_Ma閱讀 15,904評論 0 19
  • 在這個物以類聚人以群分的時代,程序猿也分三六九等啊卫枝。像我這種既沒有mac煎饼、又沒有機(jī)械鍵盤和Beats耳機(jī)的估計是在...
    Souv閱讀 2,391評論 32 19
  • 1,拼命三娘“熬”出來的偉大 這個世界很公平校赤,沒有誰可以隨隨便便成功吆玖,偉大都是熬出來。 不可否認(rèn)马篮,我知道柳巖是因為...
    莫楠學(xué)姐閱讀 1,170評論 0 4
  • 清晨沾乘,駕車行駛在物流路上,車輛不多浑测,車道寬敞翅阵,路旁的樹木在秋日冷風(fēng)中搖搖擺擺。 金色的陽光穿透樹葉...
    prttysun閱讀 132評論 0 0