在Android5.0最引人注意的就是MaterialDesign設計風格了,百度百科是這麼解釋MaterialDesign 的!只能說本身懶,一直沒有研究這個東西,但我發現這個東西其實在交互上真的比以前那種交互好了不少,因此我以爲有必要去學習一下這個東西。網上不少相關的內容,可是我以爲,網上的東西再好,寫的在牛逼,本身不去嘗試、不去總結都是白搭。一點意義的沒有,因此這裏本身決定總結一下,把中間的踩坑經歷和你們分享一下。android
這裏奉勸各位看官大人,無論什麼文章。寫的再好再爛也是人家的,不是本身的。寫代碼就是這樣不斷的練習、不斷的學習。才能在這個知識不斷迭代的時代,不被社會淘汰!bash
其實對於Toolbar要求不高的話,展現是很簡單的直接在佈局中添加就行了。像下面這樣app
修改主題樣式ide
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--Toolbar主題的設置,Application使用的是這個主題-->
<style name="BaseTheme" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
複製代碼
設置ToolBar佈局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jinlong.newmaterialdesign.MainActivity">
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimaryDark"
app:navigationIcon="@mipmap/back_icon"
app:title="ToolBar的展現"
app:titleTextColor="@android:color/white" />
</android.support.constraint.ConstraintLayout>
複製代碼
這裏面有一些經常使用屬性簡單介紹一下:學習
所有設置後是這個樣子的。這裏嘮叨一句,其實ToolBar不是隻能設置到頂上了,只要你想,設置到哪裏都是能夠的!ui
每次我看到細節這個詞的時候,就會囉嗦好久,好久。。。this
這裏要導入v7下的包(新版本的)!這裏你要是導入的是widger的話,可能有的API會有些出入的!關於ActionBar的使用就再也不這裏講解了。google
或許在以前的項目中你會看見ActionBar的影子,這是由於以前實現這種標題都使用的是ActionBar,可是後來在5.0的時候Toolbar替代了ActionBar。spa
setSupportActionBar(Toolbar toolbar);//向下兼容的版本可使用,注意這裏設置的是v7包下的Toolbar
setActionBar(Toolbar toolbar);//21版本才能使用的方法,注意這裏設置的是widget包下的Toolbar
複製代碼
若是你不關聯ActionBar的時候是沒有辦法使用menu的!!!因此你想使用menu的時候就必須關聯ActionBar。
這裏就看你對Toolbar是否瞭解了,其實Toolbar是一個繼承ViewGroup的控件,這就說明它是能夠有內部控件的!這說明了什麼呢?說明標題的居中很簡單,直接在內部添加一個TextView看成標題就能夠了!
```
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimaryDark"
app:navigationIcon="@mipmap/back_icon"
app:subtitleTextColor="@color/colorAccent"
app:titleTextColor="@android:color/white">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Toolbar的使用"
android:textColor="@android:color/white"
android:textSize="20sp" />
</android.support.v7.widget.Toolbar>
```
複製代碼
這裏有一個注意點:當你關聯了ActionBar的時候,會出現兩個標題,像變成這樣了!
解決辦法有兩種:
toolbar.setTitle("")
方法進行解決這樣界面就能恢復到上面那樣了,其實以前在這裏也踩過坑!!!因此我在上面說,關聯ActionBar會有一些意象不到的現象
設置menu其實很簡單,可是menu的使用就有不少的問題了。至於menu不清楚的,能夠在以後Android中menu的使用集錦中理解關於menu的使用。其實Toolbar集成menu是很簡單的,其實就是重寫Activity的**boolean onCreateOptionsMenu(Menu menu)**的方法,這個方法返回一個boolean,用來判斷你是否建立了相應的menu文件。代碼是這樣滴。。。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_main,menu);
return true;
}
複製代碼
menu文件是這樣的!
<?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/app_bar_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="搜索"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:icon="@mipmap/ic_directions_bike_white_24dp"
android:title="騎行"
app:showAsAction="never" />
<item
android:icon="@mipmap/ic_directions_bike_white_24dp"
android:title="其餘"
app:showAsAction="never" />
</menu>
複製代碼
然而你發現並無顯示出來。。。爲何呢?由於上面和你說過,若是不設置ActionBar是沒有辦法關聯menu文件的!因此你要把代碼變成這樣!
private void initToolbar() {
Toolbar toolbar =findViewById(R.id.toolbar);
toolbar.setTitle("");
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_main,menu);
return true;
}
複製代碼
**setSupportActionbar(toolbar)**這一行代碼千萬別忘了,不然是顯示不出來的!!!
這裏有個問題說一下,toolbar上最多展現一個標題(過長的話,後面會用...代替),一個navigationIcon(返回鍵),一個logo,最多三個圖標(這裏包括那三個點) 顯示出來是這個樣子的!
感受好醜啊,白的字配上黑色的圖標。。。瞬間炸裂。並且你會發現點擊右側的按鈕會變成這個樣子?納尼。。。
若是大家的UI能接受這種樣式,那麼大家UI該跑路了。。。
Toolbar有這樣一個屬性
popupTheme="@style/ToolbarPopupTheme"
這個屬性是給Toolbar設置主題的!全部的位置,和上面的圖片顏色都是基於這個屬性進行設置的,那麼咱們來看看這個主題應該怎麼去進行設置!!!
<!--Toolbar的Theme的設置,都是針對popup的設置-->
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:colorBackground">#223344</item><!--設置背景顏色的-->
<item name="android:textColorPrimary">@android:color/white</item><!--設置文字顏色的-->
<item name="android:textSize">16sp</item><!--設置文字大小的-->
</style>
複製代碼
設置好後,千萬別忘了設置popupTheme="@style/ToolbarTheme
,這樣彈出款那個的顯示問題咱們就解決了。
<!--Toolbar的Theme的設置,都是針對popup的設置-->
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:colorBackground">#223344</item><!--設置背景顏色的-->
<item name="android:textColorPrimary">@android:color/white</item><!--設置文字顏色的-->
<item name="android:textSize">16sp</item><!--設置文字大小的-->
<item name="actionOverflowMenuStyle">@style/OverflowMenuTheme</item><!--設置彈出位置的主題-->
</style>
<!--Toolbar彈出popup主題的設置-->
<style name="OverflowMenuTheme" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
<item name="overlapAnchor">false</item><!--這個屬性設置爲false,就能使得popup在Toolbar的下面顯示-->
</style>
複製代碼
這裏注意一個問題:actionOverflowMenuStyle這個屬性什麼版本均可以使用,可是若是你寫成android:actionOverflowMenuStyle的話,就變成了只有21版本才能使用的了。
能夠看出,位置文字顏色都改變了,可是這個溢出菜單和搜索那個按鈕實在是太醜了。這樣我是拒絕的。。。
其實修改溢出菜單就要修改相應的主題樣式了,記得前面最開始修改的主題把,只要在上面加上
<item name="android:textColorSecondary">#ffffff</item>
就能夠了。而後主題變成了這個樣子。。。
<!--Toolbar主題的設置,Application使用的是這個主題-->
<style name="BaseTheme" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:textColorSecondary">#ffffff</item>
</style>
複製代碼
這樣頁面就變成了這個樣子
總算是看着像點樣子了。。。可是存在像素眼的UI會說,看爲何右邊有個白邊。。。我想說大白邊很厲害的。。。其實這麼設置是有道理的,meterialDesign存在一個層級,這裏右邊是留給陰影的。可是UI要是說無論。。。好吧咱們改!
其實這個東西挺好改的。直接在剛纔的主題中添加這麼一個屬性
<item name="android:paddingRight">-5dp</item>
這裏若是你設置0的時候就像上面那樣,可是你要是設置成-5的話,他就乖乖的跑到右邊去了。。。主題就變成了!
<!--Toolbar的Theme的設置,都是針對popup的設置-->
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:background">#223344</item><!--設置背景顏色的-->
<item name="android:textColorPrimary">@android:color/white</item><!--設置文字顏色的-->
<item name="android:textSize">16sp</item><!--設置文字大小的-->
<item name="actionOverflowMenuStyle">@style/OverflowMenuTheme</item><!--設置彈出位置的主題-->
<item name="actionOverflowButtonStyle">@style/OverflowTheme</item>
<item name="android:paddingRight">-5dp</item>
</style>
複製代碼
若是這樣美工還不滿意,你就讓她去死吧!!!
設置點擊監聽分爲兩種 - 設置ActionBar的監聽(這個主要是針對menu的開發內容) - 沒有設置ActionBar的監聽(這個主要是針對Toolbar內部設置的控件和navigationIcon的監聽)
接下來咱們就根據上面的內容進行相應的講解!!!
對於menu的監聽,基本上都是監聽
onOptionsItemSelected(MenuItem item)
這個方法,具體和onclickListener的監聽都相似,像下面這樣
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_cycling:
Toast.makeText(this, "騎行", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_other:
Toast.makeText(this, "其餘", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
複製代碼
這裏爲何我說是返回呢?由於大部分的應用都會在此到處理返回的邏輯的。google也早就設計好了,因此把nacigationIcon的監聽單獨到Toolbar身上了。。。
這樣點擊就能實現相應的menu點擊效果了,你可能會問了,爲何搜索那個按鈕沒有點擊效果,不是我沒錄,而是關於這個搜索按鈕裏面有不少細節須要講解,限於篇幅吧!準備在以後單獨寫一下!會在以後Toolbar之搜索按鈕的使用中於你們見面!其實這裏還存在一個menu組的概念,這裏在以後Android中menu的使用集錦講到,還請你們關注!
最開始看見Toolbar是在知乎上,知乎APP的ToolBar當時以爲很好看,後來由於工做的緣由就擱置了。其實也是很簡單的。最開是知乎的首頁是這個樣子的!
上面都講了關於這些的內容,因此這裏我就直接貼代碼了,請原諒個人懶!!!
首先是佈局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jinlong.newmaterialdesign.ZhiHuToolbarActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbarZhiHu"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimaryDark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navigationIcon="@mipmap/ic_zhbook_show_directory"
app:title="首頁"
app:popupTheme="@style/ToolbarTheme"
app:titleTextColor="@android:color/white" />
</android.support.constraint.ConstraintLayout>
複製代碼
menu文件
<?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/menu_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="搜索"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_cycling"
android:icon="@mipmap/ic_directions_bike_white_24dp"
android:title="去知乎的Toolbar"
app:showAsAction="never" />
<item
android:id="@+id/menu_other"
android:icon="@mipmap/ic_directions_bike_white_24dp"
android:title="其餘"
app:showAsAction="never" />
</menu>
複製代碼
主頁面代碼
public class ZhiHuToolbarActivity extends AppCompatActivity {
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zhi_hu_toolbar);
setToolBar();
setToolBarListener();
}
private void setToolBar() {
mToolbar = findViewById(R.id.toolbarZhiHu);
setSupportActionBar(mToolbar);
}
private void setToolBarListener() {
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_zhihu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_delete:
Toast.makeText(this, "刪除按鈕", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_other:
Toast.makeText(this, "其餘按鈕", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_setting:
Toast.makeText(this, "設置按鈕", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
複製代碼
主題style
<!--Toolbar的Theme的設置,都是針對popup的設置-->
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:background">#223344</item><!--設置背景顏色的-->
<item name="android:textColorPrimary">@android:color/white</item><!--設置文字顏色的-->
<item name="android:textSize">16sp</item><!--設置文字大小的-->
<item name="actionOverflowMenuStyle">@style/OverflowMenuTheme</item><!--設置彈出位置的主題-->
<item name="android:paddingRight">-5dp</item>
</style>
<!--Toolbar彈出popup主題的設置-->
<style name="OverflowMenuTheme" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
<item name="overlapAnchor">false</item><!--這個屬性設置爲false,就能使得popup在Toolbar的下面顯示-->
</style>
複製代碼
menu的長按事件
有的童鞋可能會發現,menu長按會彈出一個Toast十分的影響美觀,這裏教你們去掉他!直接將title設置成空串就能夠了!
navigationIcon和Title的距離問題
在24版本navigationIcon和Title的距離很遠,看着不是很美觀。怎麼解決呢?固然是拉近彼此的距離了!!!
<!--navigationIcon和Title的距離問題-->
<style name="NoSpaceActionBarTheme" parent="Base.Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
<item name="contentInsetStartWithNavigation">0dp</item>
</style>
複製代碼
上面兩個控制的距離是同樣的!!!而後經這個style加到相應的基類主題中去,像下面這樣(根據contentInsetStart值就能控制之間的距離了):
<!--Toolbar主題的設置-->
<style name="BaseTheme" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:textColorSecondary">#ffffff</item>
<item name="toolbarStyle">@style/NoSpaceActionBarTheme</item>
</style>
複製代碼
上面基本上涵蓋了Toolbar的使用,若是有什麼遺漏的問題,還請廣大童鞋指出,我及時添加上去。原本我還想寫一個和網易雲音樂相似的Toolbar來的,可是由於涉及到SearchView,因此會在以後的Toolbar之搜索按鈕的使用中進行講解!但願感興趣的童鞋到時候不要錯過。。。