Android ToolBar 使用完全解析

ToolBar簡介

ToolBar是Android 5.0推出的一個新的導航控件用于取代之前的ActionBar,由于其高度的可定制性、靈活性、具有Material Design風格等優點,越來越多的應用也用上了ToolBar,比如常用的知乎軟件其頂部導航欄正是使用ToolBar。官方考慮到仍有一部分用戶的手機版本號低于5.0,所以,ToolBar也放進了support v7包內,使得低版本的系統也能使用上ToolBar。本文將使用support v7支持包的ToolBar來進行講解,包括其基本用法、樣式定制等知識點。

ToolBar的基本使用

引入support v7支持包

在你項目的build.gradle內輸入如下代碼,即能引入支持包,該支持包內有能向下兼容的ToolBar:

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

更改主題

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

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

繼承了Theme.Appcompat.Light.NoActionBar主題,這里提一下,這個Theme.AppCompat是支持包內的主題,對應著5.0版本的Theme.Material主題。然后在manifest文件中引用這個主題。

在布局文件中創建這個控件,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.Toolbarandroid: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="標題" android:textSize="20sp"/> </android.support.v7.widget.Toolbar> </FrameLayout>

在上面,創建了android.support.v7.widget.Toolbar,同時我們在內部放了一個TextView,這是與ActionBar最大的不同,因為ToolBar實際上是一個ViewGroup,支持在其內部放入子View。ok,我們運行程序,得到如下結果:


結果1.png


可以看出ToolBar正常顯示,當然了,這只是最簡單的用法,接下來我們逐步添加內容、樣式,使它看起開更加美,功能更加完善。

ToolBar的完善

一、首先我們考慮,改變ToolBar的顏色

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

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

然后在布局文件中,添加如下屬性:

android:background="?attr/colorPrimary"

這樣,就能方便對每一個toolbar引用同樣的顏色了,我們先看看現在的效果是怎樣的:


結果2.png


可以看到,顏色已經改變,同時我們注意到,頂部狀態欄的顏色也變成了深藍色,這是因為添加了"colorPrimaryDark"的屬性,使得頂部狀態欄隨之改變,利用這一特性,我們可以輕松實現“狀態欄沉浸”的效果了。當然,這只適用于Android 5.0以上,如果在低版本則這個屬性無效。這里再附上一張圖(圖片來自http://blog.csdn.net/bbld_/article/details/41439715):


樣式說明


根據圖中的說明,我們可以輕松地在styles.xml文件中定制我們的樣式,如果想要改變toolbar的title、subtitle以及menu中文字的顏色,可以利用“textColorPrimary”屬性等。

二、添加title、subtitle、logo、導航欄圖標

在MainActivity文件先獲取控件的實例,接著通過一系列的set方法即可設置,代碼如下:

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); //設置導航圖標要在setSupportActionBar方法之后 setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.mipmap.ic_drawer_home); } }

結果如下:


結果3.png


如果你想修改標題和子標題的字體大小、顏色等,可以調用 setTitleTextColorsetTitleTextAppearancesetSubtitleTextColorsetSubtitleTextAppearance 這些API。當然,這些設置都是支持在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>

三、添加菜單選項圖標及點擊事件

1.添加菜單選項圖標

一般導航條,在其右側都會有菜單選項,當然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內部的,因此不能使用android:showAsAction,否則會報錯。然后ifRoom表示有空間則顯示,never表示從不顯示,而是會通過overflowwindow顯示。
接著我們在Activity中,要重寫onCreateOptionsMenu()方法,把這個菜單加載進去:

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

2.添加點擊事件

菜單有了,我們要為菜單添加點擊事件,這樣菜單才會有實際用途,添加點擊事件也很方便,可以這樣操作:

//設置導航圖標、添加菜單點擊事件要在setSupportActionBar方法之后setSupportActionBar(toolbar);toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {@Overridepublic 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; } });

結果如下:


結果5.png


可以看到,菜單選項圖標正常顯示,以及點擊事件都正常觸發,但是還有一點瑕疵的地方,那就是右上角的三個圓點,是黑色的,與圖標格格不入,有沒有什么辦法改變它呢?答案是有的,可以通過添加樣式改變,如下所示:

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

"android:textColorSecondary"屬性對應的就是右上角三個圓點的顏色了。改變之后將會變成你要的顏色。

四、其他樣式修改

修改Toolbar popup menu樣式

我們先點擊右上角的三個點,會彈出一個popup menu,如下所示:


結果6.png


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

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

可以看到這個主題的parent是直接繼承自ThemeOverlay.AppCompat.Dark,是支持包的一個主題,并且我們在內部聲明了“android:colorBackground”這個屬性,我們只要更改這個屬性就能變更菜單的背景顏色了。接下來我們在布局文件中引入這個主題,這也很簡單,為toolbar添加額外的屬性如下:

toolbar:popupTheme="@style/ToolbarPopupTheme"

這樣,改幾行代碼即可修改popup menu的背景顏色了,如下面所示:


結果7.png

修改Toolbar 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>

效果如下圖:


結果8.png

那么到目前為止,對于toolbar的相關使用意見講述完畢,可以看出toolbar的靈活性很高,能自定義很多樣式,我們平常開發也會遇到各種不同的樣式,因此toolbar用于取代actionbar是非常合適的。以后如果還有遇到別的樣式,我也會分享出來,謝謝。



作者:陳育
鏈接:http://www.jianshu.com/p/ae0013a4f71a
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【零散積累】傳輸文件(sz/rz/scp命令)

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 01> 傳輸文件&#xff08;sz/rz/scp命令&#xff09; 工作中的傳輸文件會出現在linux之間&#xff0c;或者linux與windows之間。 一、怎么實現linux與windows之間的文件傳輸&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成將已編碼數據參數和待編碼數據裝入到h->mb.cache中,下圖是BUF中存儲的數據在以MB為單位的時候的存儲順序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把當前宏塊的up宏塊和left宏塊的intra4x4_pred_mode&#xff0c;non_zero_count加載進來&#xff0c…

U(優)盤安裝FreeBSD-9.0+GNOME_lite桌面

貼圖在我的主頁&#xff1a;http://hi.baidu.com/daodej/item/26313f4fc3db51ef1f19bcc6 修訂于&#xff1a;2012/07/04 標題&#xff1a;U(優)盤安裝FreeBSD-9.0GNOME_lite桌面&#xff0c;boot0啟動XP(Windows)、FreeBSD、Ubuntu(Linux)三系統 【黑括號表示說明&#xff0c;中…

【零散積累】 vim常用操作

類型 操作 含義 刪除 dd 刪除游標所在的一整行(常用) ndd n為數字。刪除光標所在的向下n行&#xff0c;例如20dd則是刪除光標所在的向下20行 d1G 刪除光標所在到第一行的所有數據 dG 刪除光標所在到最后一行的所有數據 d$ 刪除光標所在處&#xff0c;到該…

生活中常見物聯網實例_物聯網網關常見問題解答(一)

1.為什么物聯網解決方案需要網關&#xff1f;物聯網網關彌合了設備&#xff0c;傳感器&#xff0c;設備&#xff0c;系統和云之間的通信鴻溝。通過系統地連接云&#xff0c;物聯網網關提供了本地處理和存儲&#xff0c;并具有基于傳感器輸入的數據自主控制現場設備的功能。物聯…

predict_16x16[i_mode]( p_dst, i_stride )lowres

h->predict_16x16[i_mode]( p_dst, i_stride ); 計算對應預測模式時的預測采樣值。輸出放到dst指向的數組中。Pred0ct_16x16是7個元素指向的數組&#xff0c;數組的每個元素是一個指向函數的指針變量&#xff0c;在x264_predict_16x16_init函數初始這個指針數組。7個元素分…

【零散積累】shell腳本學習

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 03> shell腳本學習 case Shell case語句&#xff08;多分支條件判斷&#xff09; $( ) Linux—shell中$(( ))、$( )、與${ }的區別 - chengd - 博客園 在bash中&#xff0c;$( )與 &#xff08;反引號&…

mysql 表鎖-解鎖

遇到問題“”用工具navicat打開一張表的時候&#xff0c;有的時候會發現這張表怎么打不開&#xff0c;關了navicat工具&#xff0c;再打開&#xff0c;也是同樣的狀態。查看表鎖&#xff1a;show OPEN TABLES where In_use > 0;查看是否是表鎖住了。-- 查看進程號 show proc…

alsa 測試 linux_Electron 構建步驟 (Linux)

遵循下面的引導&#xff0c;在 Linux 上構建 Electron .PrerequisitesPython 2.7.x. 一些發行版如 CentOS 仍然使用 Python 2.6.x &#xff0c;所以或許需要 check 你的 Python 版本&#xff0c;使用 python -V.Node.js v0.12.x. 有很多方法來安裝 Node. 可以從 Node.js下載原文…

JavaScript中的數學對象Math

js數學對象Math //四舍五入 var res Math.round(5.921);//獲取最大值 var res Math.max(10,23,523,43,65,46,32,32);//獲取最小值 var res Math.min(12312,324,32,42,3,23,412,4332,21,3,-1);//獲取絕對值 var res Math.abs(-100);//退一取整 var res Math.floor(1.9);//…

centos7-安裝mysql5.6.36

本地安裝了mysql5.7, 但和springboot整合jpa時會出現 hibernateException, 不知道為什么, 換個mysql5.6版本的mysql, 源碼安裝, cmake一直過不去, 后來改成rpm安裝 1, 獲取mysql5.6 ftp://ftp.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.6/ 下載: 解壓: 其中…

mad的問題匯總

Q&#xff1a;我想將I幀的預測圖像和原始圖像的平均絕對誤差給輸出來&#xff0c;請問這個在JM86中需要在哪一點改動呢&#xff1f;謝謝 A&#xff1a; 差值保存在diffy中&#xff1a; diffy[j][i] imgY_org[img->opix_yj][img->opix_xi] - pred[j][i]; 分析MAD不知道程…

迷之騷縮寫

搜集一些 GitHub 常見騷縮寫&#xff0c;以備查詢使用。 原文鏈接&#xff1a;LGTM? 那些迷之縮寫 PR: Pull Request. 拉取請求&#xff0c;給其他項目提交代碼LGTM: Looks Good To Me. 朕知道了 代碼已經過 review&#xff0c;可以合并SGTM: Sounds Good To Me. 和上面那句意…

github設置中文_靜態博客托管圖片至 GitHub

從 MWeb 切換到靜態博客 Jekyll 之后&#xff0c;我就面臨一個問題&#xff0c;這在很久之前使用 Hexo 同樣遇過的&#xff1a;圖片托管在何處。MWeb 的解決方式很棒&#xff0c;直接插入圖片&#xff0c;推送到 Github 后亦能正常引用并顯示&#xff0c;無需圖床或者借助第三方…

JavaScript中的正則

js正則 正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串, 正則表達式通常被用來檢索、替換那些符合某個模式的文本 聲明方式 普通字符 new RegExp();/hehe/轉義字符 \w \W \d \D \s \S var reg /\w/;//單個的字母數字下劃線 var reg /\W/;…

SQL注入【sqli靶場第23-28關】(七)

★★免責聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性&#xff0c;僅供安全研究與學習之用&#xff0c;讀者將信息做其他用途&#xff0c;由Ta承擔全部法律及連帶責任&#xff0c;文章作者不承擔任何法律及連帶責任。 0、總體思路 先確認是否可以SQL注入&#xff0c;使用單…

Linq中string轉int的方法

Linq中string轉int的方法 在做批量刪除時&#xff0c;需把一串id值所對應的數據刪除&#xff0c;調試出現問題&#xff1a; Linq語句中如果使用ToString()進行類型轉換,編譯時不會報錯,但執行時會出現如下錯誤&#xff1a; “LINQ to Entities 不識別方法"System.String T…

名稱縮寫第二波

1 公司內部 縮寫 全稱 中文 說明 PMproduct manager產品經理RDResearch and Development研發工程師FEFrontend Engineer前端工程師UEUser Experience用戶體驗設計師QAquality assurance質量保證&#xff0c;測試OP operator 運維工程師EEEngeering Excellence工程效率部ETEn…

php動態獲取函數參數

PHP 在用戶自定義函數中支持可變數量的參數列表。其實很簡單&#xff0c;只需使用func_num_args() &#xff0c; func_get_arg() &#xff0c;和 func_get_args() 函數即可。可變參數并不需要特別的語法&#xff0c;參數列表仍按函數定義的方式傳遞給函數&#xff0c;并按通常…

漏桶算法與令牌桶算法

漏桶算法(Leaky Bucket)是網絡世界中流量整形&#xff08;Traffic Shaping&#xff09;或速率限制&#xff08;Rate Limiting&#xff09;時經常使用的一種算法&#xff0c;它的主要目的是控制數據注入到網絡的速率&#xff0c;平滑網絡上的突發流量。漏桶算法提供了一種機制&a…