說起Android app的標(biāo)題欄榜揖,有默認(rèn)的ActionBar幢炸,現(xiàn)在應(yīng)該沒什么人用了歇僧,也有設(shè)置NoTitle之后去自定義Layout布局加入每個頁面中碧信,還有這篇文章想說的ToolBar跛溉。
ActionBar扮授,google推出ToolBar來取代ActionBar刹勃,說明ActionBar還是有其局限荔仁,不能很好的跟上google提倡的Material Design乏梁。自定義布局這種方式如果實在喜歡,也不是不可滓玖,那為什么我喜歡ToolBar势篡,因為這是google推出的禁悠,簡單東西簡單用碍侦,就好比下拉刷新,如果沒有特別要求瓷产,我也是喜歡google提供的那個刷新控件濒旦。
說了半天,該說一下ToolBar這個控件尔邓。ToolBar是5.0推出的梯嗽,一般而言我們都會用v7下的包
<android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#0000ff"/>
首先因為新建的項目都是默認(rèn)有個標(biāo)題欄的,所以要先去掉標(biāo)題欄循头,去掉標(biāo)題欄就不贅述了卡骂,這里我在代碼里去除,oncreate方法中唯笙,setcontentView 之前加上 requestWindowFeature(Window.FEATURE_NO_TITLE);?
然后在代碼里面找到ToolBar控件進(jìn)行各種設(shè)置崩掘,不設(shè)置的項苞慢,不會顯示
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.arrow);//設(shè)置左邊圖片
toolbar.setLogo(R.drawable.ic_launcher);//設(shè)置app logo
toolbar.setTitle("標(biāo)題");//設(shè)置標(biāo)題
toolbar.setSubtitle("小標(biāo)題");//設(shè)置小標(biāo)題
toolbar.inflateMenu(R.menu.menu_main);//設(shè)置右側(cè)菜單
這里有個菜單項
res目錄下新建一個menu文件夾绍赛,存放menu的xml文件
menu的格式如下
menu里面設(shè)置菜單項吗蚌,不限個數(shù),可以為該菜單項設(shè)置圖片纯出,如果沒設(shè)置圖片,顯示的就是title的文字暂筝,如果設(shè)置了圖片,顯示圖片焕襟,同時長按圖片會彈出title文字陨收,這里有個showAsAction屬性胧洒,常用的是ifRoom畏吓,表示如果有剩余空間,則顯示該項卫漫。never,表示永遠(yuǎn)不會顯示該項列赎,如果有一個item設(shè)置了never包吝,那么ToolBar的最右端會有一個設(shè)置選項诗越,點擊會彈出設(shè)置了never的菜單項嚷狞,always块促,表示總是顯示該項。如果你設(shè)置了很多個always薇搁,那會一直向左擠斋扰,使左邊的控件隱藏。應(yīng)該沒人這樣搞吧。传货。給自己找事不是么屎鳍。。
ToolBar上的各種控件损离,相應(yīng)的也可以設(shè)置一些屬性哥艇,比如設(shè)置標(biāo)題的字體大小,顏色
左側(cè)圖片的點擊事件僻澎,右側(cè)菜單的點擊事件
字體的就不多說了貌踏,下面是點擊事件的設(shè)置
//導(dǎo)航按鈕點擊
toolbar.setNavigationOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
//TODO? dosomething
}
});
//菜單點擊
toolbar.setOnMenuItemClickListener(newToolbar.OnMenuItemClickListener() {
@Override
public booleanonMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
caseaction_edit:
break;
caseaction_share:
break;
caseaction_setting:
break;
}
Toast.makeText(MainActivity.this,"onClick"+item.getTitle(),Toast.LENGTH_SHORT).show();
return false;
}
});
實際上講到這里ToolBar已經(jīng)可以正常使用了
大概就是這樣
但是有時候這么一層不變的UI并不能滿足千變?nèi)f化的需求
比如說這個標(biāo)題需要居中,原生的ToolBar并沒有提供接口讓開發(fā)去設(shè)置窟勃,標(biāo)題一定是靠著logo右端的
標(biāo)題居中祖乳,我們可以這樣做,因為ToolBar是一個ViewGroup秉氧,所以他可以添加子控件眷昆,我們在布局的Toolbar里添加一個TextView來取代原先的標(biāo)題
<android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#0000ff">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="我是居中的標(biāo)題"/>
</android.support.v7.widget.Toolbar>
另外一點,就是ToolBar的重用問題汁咏,給一個單獨的Layout布局亚斋,include到需要標(biāo)題欄的地方,可以減少很多重復(fù)代碼
如果像我上面這樣使用ToolBar攘滩,(有另外一種setSupportActionBar(toolbar);)
相比起來帅刊,第二種使用toolbar去替換原先的ActionBar,所以他可以調(diào)用onCreateOptionsMenu漂问,onPrepareOptionsMenu赖瞒,之類的方法,來操作右邊的menu蚤假,而第一種直接在toolbar里調(diào)用方法去inflate一個menu栏饮。這里是有一個考慮,就是如果相同的toolbar磷仰,右端menu可能展示是不一樣的袍嬉,如果有第二中方法,可以在onPrepareOptionsMenu里做各種判斷灶平,讓menu展示哪個伺通,而第一種,因為不走這個方法民逼,所以不能這樣操作泵殴。
其實只要在創(chuàng)建toolbar的時候inflate另外的menu布局就行了涮帘,還省了許多邏輯判斷
最后呢
在用toolbar的時候拼苍,上面的高度設(shè)置成?attr/actionBarSize,是默認(rèn)的標(biāo)題欄高度,如果你設(shè)置成wrap_content也是一樣的效果,高度是56dp,這應(yīng)該是google推薦的一個高度疮鲫,(并且不推薦開發(fā)者修改),如果你設(shè)置高度太小吆你,那整個標(biāo)題欄看起來的效果就會差強(qiáng)人意,該居中的不居中了俊犯,該對其的沒有對齊妇多。如果你的標(biāo)題欄需要原生的這種效果,那不建議修改高度燕侠,如果你是只有一個居中標(biāo)題的那種者祖,toolbar里加一個TextView設(shè)置居中,高度就隨便你設(shè)置了~不過如此簡單的布局toolbar好像大材小用了~
第一次發(fā)文绢彤,有什么錯誤的歡迎指出~