Android Toolbar AppCompatActivity

參考
Android ToolBar 使用完全解析
Android開發(fā):最詳細(xì)的 Toolbar 開發(fā)實踐總結(jié)
Android Material Design之Toolbar與Palette實踐

ToolBar是Android 5.0推出的一個新的導(dǎo)航控件用于取代之前的ActionBar,由于其高度的可定制性、靈活性、具有Material Design風(fēng)格等優(yōu)點术浪,越來越多的應(yīng)用也用上了ToolBar,比如常用的知乎軟件其頂部導(dǎo)航欄正是使用ToolBar。官方考慮到仍有一部分用戶的手機(jī)版本號低于5.0速种,所以,ToolBar也放進(jìn)了support v7包內(nèi)低千,使得低版本的系統(tǒng)也能使用上ToolBar配阵。本文將使用support v7支持包的ToolBar來進(jìn)行講解,包括其基本用法示血、樣式定制等知識點棋傍。

一、基本用法

1.引入support v7支持包
在你項目的build.gradle內(nèi)輸入如下代碼难审,即能引入支持包瘫拣,該支持包內(nèi)有能向下兼容的ToolBar:

dependencies {    
      compile fileTree(dir: 'libs', include: ['*.jar'])    
      compile 'com.android.support:appcompat-v7:23.1.1'
}

2.更改主題
為了能夠正常使用ToolBar,我們需要隱藏原來的ActionBar告喊,這個可以在主題中修改麸拄,在values/styles.xml中做出如下修改:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> </style>

繼承了Theme.Appcompat.Light.NoActionBar主題,這里提一下葱绒,這個Theme.AppCompat是支持包內(nèi)的主題感帅,對應(yīng)著5.0版本的Theme.Material主題。然后在manifest文件中引用這個主題地淀。
3.創(chuàng)建控件

toolbar簡單用法

activity_main.xml文件中失球,代碼如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="標(biāo)題"
            android:textSize="20sp"/>
    </android.support.v7.widget.Toolbar>
</FrameLayout>

創(chuàng)建了android.support.v7.widget.Toolbar,同時我們在內(nèi)部放了一個TextView,這是與ActionBar最大的不同实苞,因為ToolBar實際上是一個ViewGroup豺撑,支持在其內(nèi)部放入子View。

二黔牵、Toolbar完善

1.改變ToolBar的顏色
要想改變toolbar的顏色很簡單聪轿,直接在布局文件中添加一個backgroud屬性指定顏色就可以了,但是為了全局考慮猾浦,我們可以這樣:在values/styles.xml文件中做出如下修改:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#2e8abb</item> <!--淺藍(lán)色-->
        <item name="colorPrimaryDark">#3A5FCD</item> <!--深藍(lán)色-->
    </style>
</resources>

顏色具體參考

然后在布局文件中陆错,添加如下屬性:
android:background="?attr/colorPrimary"
這樣,就能方便對每一個toolbar引用同樣的顏色了金赦,我們先看看現(xiàn)在的效果是怎樣的:

設(shè)置了background

可以看到音瓷,顏色已經(jīng)改變,同時我們注意到夹抗,頂部狀態(tài)欄的顏色也變成了深藍(lán)色绳慎,這是因為添加了”colorPrimaryDark”的屬性,使得頂部狀態(tài)欄隨之改變漠烧,利用這一特性杏愤,我們可以輕松實現(xiàn)“狀態(tài)欄沉浸”的效果了。當(dāng)然已脓,這只適用于Android 5.0以上珊楼,如果在低版本則這個屬性無效。

2.添加title摆舟、subtitle亥曹、logo、導(dǎo)航欄圖標(biāo)

標(biāo)題恨诱、子標(biāo)題媳瞪、LOGO
public class MainActivity extends AppCompatActivity {
    private Toolbar toolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("Title");
        toolbar.setSubtitle("SubTitle");
        toolbar.setLogo(R.mipmap.ic_launcher);

        //設(shè)置導(dǎo)航圖標(biāo)要在setSupportActionBar方法之后
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);
    }
}

如果你想修改標(biāo)題和子標(biāo)題的字體大小、顏色等照宝,可以調(diào)用
setTitleTextColor 蛇受、 setTitleTextAppearance
setSubtitleTextColor 厕鹃、setSubtitleTextAppearance

當(dāng)然兢仰,這些設(shè)置都是支持在xml布局中直接添加的,但是用的不是android:命名空間剂碴,而是自定義命名空間把将,如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:toolbar="http://schemas.android.com/apk/res-auto"
    ...>
    <android.support.v7.widget.Toolbar
        ...
        toolbar:logo="@mipmap/ic_launcher"
        toolbar:title="Title"
        toolbar:subtitle="Sub Title"
        toolbar:titleTextColor="#ffffff">
    </android.support.v7.widget.Toolbar>
</FrameLayout>

3.添加菜單選項
一般導(dǎo)航條,在其右側(cè)都會有菜單選項忆矛,當(dāng)然ToolBar也是支持自定義菜單的察蹲,首先我們在菜單文件中请垛,修改如下:res/menu/menu_main.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">
    <item android:id="@+id/action_search"
        android:title="Search"
        android:icon="@mipmap/ic_search"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/action_notifications"
        android:title="notifications"
        android:icon="@mipmap/ic_notifications"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        android:icon="@mipmap/ic_launcher"
        app:showAsAction="never"/>
</menu>

app:showAsAction=”ifRoom”/”never”,app是自定義的命名空間洽议,因為我們的activity繼承的是AppCompatActivity宗收,是support v7包的,并不是原生sdk內(nèi)部的亚兄,因此不能使用android:showAsAction混稽,否則會報錯。然后ifRoom表示有空間則顯示审胚,never表示從不顯示匈勋,而是會通過overflowwindow顯示。 接著我們在Activity中菲盾,要重寫onCreateOptionsMenu()方法颓影,把這個菜單加載進(jìn)去:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) { 
       getMenuInflater().inflate(R.menu.menu_main, menu);   
       return true;
}

添加點擊事件

//設(shè)置導(dǎo)航圖標(biāo)、添加菜單點擊事件要在setSupportActionBar方法之后
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_search:
                        Toast.makeText(MainActivity.this,
                        "Search !", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_notifications:
                        Toast.makeText(MainActivity.this,
                        "Notificationa !", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_settings:
                        Toast.makeText(MainActivity.this,
                        "Settings !", Toast.LENGTH_SHORT).show();
                        break;
                }
                return true;
            }
        });

“android:textColorSecondary”屬性對應(yīng)的就是右上角三個圓點的顏色了懒鉴。改變之后將會變成你要的顏色。

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:textColorSecondary">#ffffff</item>
    </style>
</resources>

4.其它樣式修改

點擊右上角的三個點彈出popup menu

可以看到右上角的popup menu是白底黑字碎浇,那么有沒有什么辦法改變它的背景顏色临谱,使菜單顯示為黑底白字呢呢?答案是有的奴璃,我們可以這樣設(shè)置: 首先在styles.xml文件中悉默,新建一個主題:

<!-- toolbar彈出菜單樣式 -->
<style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark">   
     <item name="android:colorBackground">#000000</item>
</style>

可以看到這個主題的parent是直接繼承自ThemeOverlay.AppCompat.Dark,是支持包的一個主題苟穆,并且我們在內(nèi)部聲明了“android:colorBackground”這個屬性抄课,我們只要更改這個屬性就能變更菜單的背景顏色了。接下來我們在布局文件中引入這個主題雳旅,這也很簡單跟磨,為toolbar添加額外的屬性如下:
toolbar:popupTheme="@style/ToolbarPopupTheme"

popup menu改變顏色

我們可以看到,popup menu的位置是過于偏上的攒盈,我們還可以修改它的位置抵拘,使它處于Toolbar之下,這樣看起來可能更美觀: 修改styles.xml文件如下:

<style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat.Dark">    
    <item name="android:colorBackground">#000000</item>    
    <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item> 
    <!--新增一個item型豁,用于控制menu-->
</style>
<style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">   
     <item name="overlapAnchor">false</item>  
     <!--把該屬性改為false即可使menu位置位于toolbar之下-->
</style>
popup menu位置
二僵蛛、AppCompatActivity AppCompatDialog

參考
深入剖析Android四大組件(九)——Activity之AppCompatActivity與toolbar的結(jié)合
Android Support Library更新到v22.1之AppCompat新特性
AppcompatActivity源碼淺析
**1.AppCompatActivity **

構(gòu)建一個可以跑在不同版本 Android 平臺的軟件,是非常復(fù)雜和耗時的迎变。為了解決這個問題充尉,Android 推出了 Android Support Library (安卓兼容包),讓新的UI控件也可以跑在早期的 Android 版本衣形。最近Android Support Library 更新到v22.1,這一版本主要AppCompat做了一些大的調(diào)整驼侠。
初期AppCompat只是讓Actionbar兼容到API 7。在AppCompat 21版本中,加入主題色泪电、Toolbar等功能般妙。顯然ActionBarActivity這個名字已經(jīng)不在適用AppCompat。新版本中相速,推薦使用AppCompatActivity 代替ActionBarActivity碟渺。

2.AppCompatDialog

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Dialog");
        builder.setMessage("少數(shù)派客戶端");
        builder.setPositiveButton("OK", null);
        builder.setNegativeButton("Cancel", null);
        builder.show();
AppCompatDialog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市突诬,隨后出現(xiàn)的幾起案子苫拍,更是在濱河造成了極大的恐慌,老刑警劉巖旺隙,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绒极,死亡現(xiàn)場離奇詭異,居然都是意外死亡蔬捷,警方通過查閱死者的電腦和手機(jī)垄提,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來周拐,“玉大人铡俐,你說我怎么就攤上這事⊥姿冢” “怎么了审丘?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵埃元,是天一觀的道長勘天。 經(jīng)常有香客問我,道長妇拯,這世上最難降的妖魔是什么播急? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任脓钾,我火速辦了婚禮,結(jié)果婚禮上旅择,老公的妹妹穿的比我還像新娘惭笑。我一直安慰自己,他們只是感情好生真,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布沉噩。 她就那樣靜靜地躺著,像睡著了一般柱蟀。 火紅的嫁衣襯著肌膚如雪川蒙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天长已,我揣著相機(jī)與錄音畜眨,去河邊找鬼昼牛。 笑死,一個胖子當(dāng)著我的面吹牛康聂,可吹牛的內(nèi)容都是我干的贰健。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼恬汁,長吁一口氣:“原來是場噩夢啊……” “哼伶椿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氓侧,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脊另,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后约巷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偎痛,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年独郎,在試婚紗的時候發(fā)現(xiàn)自己被綠了踩麦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡氓癌,死狀恐怖靖榕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顽铸,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布料皇,位于F島的核電站谓松,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏践剂。R本人自食惡果不足惜鬼譬,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逊脯。 院中可真熱鬧优质,春花似錦、人聲如沸军洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匕争。三九已至避乏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甘桑,已是汗流浹背拍皮。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工歹叮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铆帽。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓咆耿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爹橱。 傳聞我的和親對象是個殘疾皇子萨螺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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