Android 自訂ToolBar詳細使用
自訂xml設定ToolBar,通過menu檔案擴充選項,通過繼承baseactivity使用
1.ToolBar布局
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="@color/color_bg_toolbar">
<ImageView
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:visibility="gone"
android:src="@mipmap/ic_back"/>
<TextView
android:id="@+id/title_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
android:textColor="@color/color_bg_write"
android:text="@string/app_name"/>
<TextView
android:id="@+id/title_rightTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_marginRight="10dp"
android:layout_gravity="right"
android:textColor="@color/color_bg_write"
android:text="@string/app_name"
android:visibility="gone"/>
</android.support.v7.widget.Toolbar>
2.menu檔案(title右側表徵圖,測試發現最多隻能顯示三個,如果超過三個第三個會變成更多的選項),另一種方式就是像上邊那樣在xml布局裡寫在Toolbar標籤裡
<?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/title_scan" //id
android:title="@string/scan" //title長按顯示的文字
android:visible="false" //預設全部不顯示
android:icon="@mipmap/ic_scan" //表徵圖
app:showAsAction="ifRoom"/>
<!--添加-->
<item android:id="@+id/title_add"
android:title="@string/add"
android:icon="@mipmap/ic_add"
app:showAsAction="ifRoom"/>
<!--設定-->
<item android:id="@+id/title_setting"
android:title="@string/setting"
android:visible="false"
android:icon="@mipmap/ic_setting"
app:showAsAction="ifRoom"/>
<!--搜尋-->
<item android:id="@+id/title_search"
android:title="@string/search"
android:visible="false"
android:icon="@mipmap/ic_search"
app:showAsAction="ifRoom"/>
<!--日期-->
<item android:id="@+id/title_date"
android:title="@string/date"
android:visible="false"
android:icon="@mipmap/ic_calendar"
app:showAsAction="ifRoom"/>
<!--重新整理-->
<item android:id="@+id/title_refresh"
android:title="@string/refresh"
android:visible="false"
android:icon="@mipmap/botton_refresh"
app:showAsAction="ifRoom"/>
<!--<item android:id="@+id/title_more1"-->
<!--android:title="@string/right2"-->
<!--app:showAsAction="never"/>-->
<!--<item android:id="@+id/title_more2"-->
<!--android:title="@string/right2"-->
<!--app:showAsAction="never"/>-->
</menu>
3.BaseActivity
/**
* Created by Administrator on 2016/9/5 0005.
*/
public class BaseActivity extends AppCompatActivity implements View.OnClickListener, Toolbar.OnMenuItemClickListener {
/*Toolbar*/
private Toolbar toolBar;
/**/
private CoordinatorLayout coordinatorLayout;
/*是否第一次載入表徵圖(主要針對首頁一對多fragment)*/
private boolean title_menu_first = true;
/*是否第一次載入返回*/
private boolean title_back_first = true;
/*是否是返回(有可能是代表別的功能)*/
private boolean is_title_back = true;
/*返回*/
private ImageView titleBack;
/*標題名稱*/
private TextView titleName;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//豎屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRootView();
// coordinatorLayout = getView(R.id.coordinatorLayout);
initToolbar();
initWidght();
}
protected void setRootView(){}
protected void initWidght(){};
//
protected <T extends View>T getView(int resourcesId){
return (T) findViewById(resourcesId);
}/*初始化toolbar*/
private void initToolbar(){
toolBar = getView(R.id.toolbar);
toolBar.setTitle("");
toolBar.setTitleTextColor(Color.WHITE);
titleName = getView(R.id.title_name);
// setSupportActionBar(toolBar);
}
/**
* 設定返回
* @param back :是否返回:是-->返回,不是則設定其他表徵圖
* @param resourcesId :表徵圖id,返回時隨意設定,不使用
* */
protected void setTitleBack(final boolean back,int resourcesId){
is_title_back = back;
if (title_back_first || titleBack == null){
titleBack= getView(R.id.title_back);
titleBack.setOnClickListener(this);
title_back_first = false;
}
titleBack.setVisibility(View.VISIBLE);
if (!back){
titleBack.setImageResource(resourcesId);
}
}
/**
* 設定title
* @param title :title
* */
protected void setTitleName(String title){
titleName.setText(title);
}
/**
* title右側:表徵圖類
* */
protected void setRightRes(){
//擴充menu
toolBar.inflateMenu(R.menu.base_toolbar_menu);
//添加監聽
toolBar.setOnMenuItemClickListener(this);
}
/**
* 顯示title表徵圖
* @param itemId :itemId :表徵圖對應的選項id(1個到3個),最多顯示3兩個
* */
protected void showTitleRes(int... itemId){
if (title_menu_first){
setRightRes();
title_menu_first = false;
}
for (int item:itemId){
//顯示
toolBar.getMenu().findItem(item).setVisible(true);//通過id尋找,也可以用setIcon()設定表徵圖
// toolBar.getMenu().getItem(0).setVisible(true);//通過位置尋找
}
}
/**
* 隱藏title表徵圖
* @param itemId :表徵圖對應的選項id
* */
protected void goneTitleRes(int... itemId){
if (titleBack != null)
titleBack.setVisibility(View.GONE);
for (int item:itemId){
//隱藏
toolBar.getMenu().findItem(item).setVisible(false);
}
}
/**
* title右側文字
* @param str :文字內容
* */
protected void setTitleRightText(String str){
TextView textView = getView(R.id.title_rightTv);
textView.setVisibility(View.VISIBLE);
textView.setText(str);
textView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.title_back && is_title_back){
onBackPressed();
}
}
//toolbar菜單監聽
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
}
3.Activity使用
public class MainActivity extends BaseActivity{
@Override
protected void setRootView() {
super.setRootView();
setContentView(R.layout.activity_main);
}
@Override
protected void initWidght() {
super.initWidght();
setTitleName(getResources().getString(R.string.chat));//title
// setTitleBack(false,R.mipmap.ic_search);//有表徵圖,但不是返回
//setTitleBack(true,0);//返回
// setTitleRightText("儲存");//右側文字
showTitleRes(R.id.title_add,R.id.title.setting);//擴充menu(表徵圖)
//goneTitleRes(R.id.title_add);隱藏表徵圖,一般用不到
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.title_back){
workFragment.titleSearch();
}
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.title_add://添加
break;
case R.id.title_apps://應用break;
case R.id.title_setting://設定
break;
}
return super.onMenuItemClick(item);
}
}
Toolbar其他設定
1.去掉左邊空白,在style檔案裡設定
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorAppTheme</item>
<item name="colorPrimaryDark">@color/colorAppTheme</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="toolbarStyle" tools:ignore="NewApi">@style/MyToolBar</item>
</style>
<style name="MyToolBar" parent="Widget.AppCompat.Toolbar">
<!--左邊邊距-->
<item name="contentInsetStart">0dp</item>
</style>
https://www.bkjia.com/topicnews.aspx?tid=11
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151421.htm