由於最近在寫一個表情包的項目,剛開始寫UI的時候就把每一個頁面的頭部都用了toolbar,緣由就是我想主題顏色都是一種的,用ToolBar更方便,可是呢,看了一個大佬的代碼後發現本身的想法真的是太。。。 而後本身又去網上找了好多優秀的項目,看了看別人的使用,下面就一步步說toolbar。android
首先咱們要將ActionBar隱藏。像下面這樣api
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
複製代碼
或者bash
<style name="NoActionBar" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
複製代碼
主題的樣式就能夠經過colorPrimary、colorPrimaryDark、colorAccent來修改。app
<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"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/dodgerblue"
app:navigationIcon="@mipmap/back"
app:titleTextColor="@color/colorWhite"
app:title="知乎">
</android.support.v7.widget.Toolbar>
複製代碼
toolbar有些經常使用的屬性介紹一下:ide
在初始化Toolbar的時候通常有兩個佈局
Toolbar(android.support.v7.widget)
Toolbar(android.widget)
複製代碼
這裏須要導入V7的包!!!不然,可能會找不到Toolbar這個類。post
若是在toolbar里加入TextView的話想讓標題居中,就須要設置layout_gravity="center",如果想靠左就layout_gravity="left",靠右就layout_gravity="right"字體
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/dodgerblue"
app:navigationIcon="@mipmap/back"
app:titleTextColor="@color/colorWhite"
app:title="知乎">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="toolbar"
android:textColor="@color/colorWhite"
android:textSize="22sp"/>
</android.support.v7.widget.Toolbar>
複製代碼
由於Toolbar是一個繼承ViewGroup的控件,這就說明它是能夠有內部控件的!ui
設置menu其實很簡單,在bottomnavigationview(底部導航欄)的使用時也設置了相應的menu。Toolbar集成menu須要重寫Activity的 boolean onCreateOptionsMenu(Menu menu) 方法,此方法返回一個boolean,用來判斷你是否建立了相應的nenu文件。this
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.toolbar_menu,menu);
return true;
}
複製代碼
menu文件
<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:title="搜索"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_cycling"
android:icon="@drawable/find"
android:title="掃一掃"
app:showAsAction="never" />
<item
android:id="@+id/collection"
android:title="個人收藏"
app:showAsAction="never" />
</menu>
複製代碼
其中showAsAction可接受的值有: 這個屬性可接受的值有:
如今menu並無顯示出來,由於不設置Actionbar是沒有辦法關聯menu文件的。因此
public void setToolBar(){
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.toolbar_menu,menu);
return true;
}
複製代碼
setSupportActionbar(toolbar) 這一行代碼千萬不能忘,不然menu是顯示不出來的!!!
咱們如今發現...和搜素的圖標都是黑色的和白色的字體很很不搭,並且點開...是這樣的。。。
Toolbar有一個屬性 popuptheme="@style/ToolbarPopupTheme" 這個屬性是給Toolbar設置主題的!
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:background">#ffffff</item><!--設置彈框背景顏色-->
<item name="android:textColorPrimary">#000000</item><!--設置文字顏色-->
<item name="android:textSize">16sp</item><!--設置文字大小-->
</style>
複製代碼
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:background">#ffffff</item>
<item name="android:textColorPrimary">#000000</item>
<item name="android:textSize">16sp</item>
<item name="actionOverflowMenuStyle">@style/OverflowMenuTheme</item>
</style>
<style name="OverflowMenuTheme" parent="Widget.AppCompat.PopupMenu.Overflow">
<item name="overlapAnchor">false</item>><!--這個屬性設置爲false,就能使得popup在Toolbar的下面顯示-->
</style>
複製代碼
位置文字顏色設置了,可是溢出菜單和搜索那個按鈕太醜了
修改溢出菜單就是要修改相應的主題樣式,就是在文章開始修改的主題,只要在上面加上 item name="android:textColorSecondary"... 就能夠了。
<!-- Base application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorSecondary">#ffffff</item>
</style>
複製代碼
設置監聽分爲兩種 1.設置ActionBar的監聽(針對menu的開發內容)2.針對Toolbar內部設置的控件和navigationIcon的監聽
對於menu的監聽 onOptionItemSelected(MenuItem item) 這個方法,和onClickListener的監聽都相似
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_find:
Toast.makeText(this, "掃一掃", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_colection:
Toast.makeText(this, "收藏", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
複製代碼
由於大部分的應用都會在此到處理返回的邏輯。google也早就設計好了,因此把navigationIcon的監聽單獨到Toolbar身上了
public void setToolbarListener(){
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
複製代碼
我以爲一個項目成功的開始就在於UI,UI的美觀真的很重要,並且還要考慮加載UI時間的問題(從本身作項目開始纔開始考慮這些問題 笑哭==),以前一直讓我很困擾的是項目裏的頭部(就是相似在toolbar的位置上的那些控件開始如何擺放的),最開始我是該每一個控件加背景用相對佈局,以後學會toolbar開始在toolbar裏放控件,可是發現一個問題,toolbar裏會被限制,有好多空間的位置很差肯定,後來去看了別人的項目才發現toolbar通常都是被重寫的,目的是爲了重複利用,由於有好多的頁面他們的toolbar的佈局是同樣的,只是控件的樣式發生了改變,這裏面標籤就有了很大的用處。
上面說到了toolbar的重寫,也就是自定義view,toolbar能夠繼承LinearLayout,也能夠直接繼承toolbar。下面是繼承Linearlayout的一種寫法,我在項目中學到的。
public class Toolbar extends LinearLayout implements View.OnClickListener {
TextView title;
ImageView back;
public ImageView right1,right2;
public Toolbar(Context context) {
super(context);
initViews();
}
public Toolbar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initViews();
}
public Toolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initViews();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public Toolbar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initViews();
}
private void initViews() {
View view = LayoutInflater.from(getContext()).inflate(R.layout.widget_toolbar, this, false);
addView(view);
title = findViewById(R.id.title);
right1 = findViewById(R.id.right1);
right2 = findViewById(R.id.right2);
findViewById(R.id.back).setOnClickListener(this);
if (((Activity) getContext()).getTitle() != null) {//判斷該Activity標題是否爲空,不爲空設置到標題
title.setText(((Activity) getContext()).getTitle());
}
setRightButtonOneShow(false);//按鈕不可見(GONE)
setRightButtonTwoShow(false);//按鈕不可見(GONE)
}
//設置標題
public void setTitle(String title) {
this.title.setText(title);
}
//設置分享按鈕是否顯示
private void setRightButtonOneShow(boolean visibility){
int i = visibility? View.VISIBLE:View.GONE;
right1.setVisibility(i);
}
private void setRightButtonTwoShow(boolean visibility){
int i = visibility? View.VISIBLE:View.GONE;
right2.setVisibility(i);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back:
((Activity) getContext()).finish();
break;
}
}
}
複製代碼
這裏就是重寫的代碼,initViews()裏初始化了佈局中的控件,不想顯示的能夠隱藏,有興趣的能夠看看標籤,用於隱藏某些控件。
下面是.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/colorPrimary"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/back"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:padding="15dp"
android:src="@drawable/back" />
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:lines="1"
android:text="標題"
android:textColor="@color/colorBlack"
android:textSize="20sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/right1"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:padding="15dp"
android:src="@drawable/share" />
<ImageView
android:id="@+id/right2"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:padding="15dp"
android:src="@drawable/share" />
</LinearLayout>
複製代碼
加油哇!!!