Android自定義ToolBar並實現沉浸式的方法
前言
ToolBar是Android 5.0推出的一個新的導航控制元件用於取代之前的ActionBar,由於其高度的可定製性、靈活性、具有Material Design風格等優點,越來越多的App也用上了ToolBar。
沉浸式狀態列是從android Kitkat(Android 4.4)開始出現的,它可以被設定成與APP頂部相同的顏色,這就使得切換APP時,整個介面就好似切換到了與APP相同的風格樣式一樣。
依賴包:
Toolbar,implementation 'androidx.appcompat:appcompat:1.1.0'
沉浸式,implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
1、自定義Toolbar步驟:
1)、定義 /values/styles.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="TextAppearance_TitleBar_Title" parent="TextAppearance.AppCompat.Toolbar.Title"> ... </style> <style name="TextAppearance_TitleBar_subTitle" parent="TextAppearance.AppCompat.Toolbar.Subtitle"> .... </style> </resources>
2)、自定義toolbar 繼承 androidx.appcompat.widget.Toolbar
public class CustomToolBar extends Toolbar { private TextView mCenterTitle; private ImageView mCenterIcon; //中心icon private TextView mLeftText; private ImageButton mLeftIcon; private TextView mSettingText; private ImageButton mSettingIcon; public CustomToolBar(Context context) { super(context); } public CustomToolBar(Context context,AttributeSet attrs) { super(context,attrs); } public CustomToolBar(Context context,AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr); } public void setLeftText(@StringRes int id) { setLeftText(this.getContext().getText(id)); } public CustomToolBar setLeftText(CharSequence text) { Context context = this.getContext(); if (this.mLeftText == null) { this.mLeftText = new TextView(context); this.mLeftText.setGravity(Gravity.CENTER_VERTICAL); this.mLeftText.setSingleLine(); // this.mLeftText.setEllipsize(TextUtils.TruncateAt.END); setLeftTextAppearance(getContext(),R.style.TextAppearance_TitleBar_subTitle); //textView in left // this.addMyView(this.mLeftText,Gravity.START); int i = dp2px(this,16); this.addMyView(this.mLeftText,Gravity.START,i,48); } mLeftText.setText(text); return this; } public void setLeftTextAppearance(Context context,@StyleRes int resId) { if (this.mLeftText != null) { this.mLeftText.setTextAppearance(context,resId); } } public void setLeftTextColor(@ColorInt int color) { if (this.mLeftText != null) { this.mLeftText.setTextColor(color); } } public void setLeftTextOnClickListener(OnClickListener listener) { if (mLeftText != null) { mLeftText.setOnClickListener(listener); } } public CustomToolBar setLeftIcon(@DrawableRes int resId) { return setLeftIcon(ContextCompat.getDrawable(this.getContext(),resId)); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public CustomToolBar setLeftIcon(Drawable drawable) { Context context = this.getContext(); if (this.mLeftIcon == null) { this.mLeftIcon = new ImageButton(context); ... this.addMyView(this.mLeftIcon,Gravity.START); } else { if (mLeftIcon.getVisibility() != VISIBLE) { mLeftIcon.setVisibility(VISIBLE); } } if (mLeftText != null && mLeftText.getVisibility() != GONE) { mLeftText.setVisibility(GONE); } mLeftIcon.setImageDrawable(drawable); return this; } public void setLeftIconOnClickListener(OnClickListener listener) { if (mLeftIcon != null) { mLeftIcon.setOnClickListener(listener); } } public void setLeftIconVisibility(int visibility) { if (mLeftIcon != null) { mLeftIcon.setVisibility(visibility); } } public CustomToolBar setMyCenterTitle(@StringRes int id,boolean center) { return setMyCenterTitle(this.getContext().getText(id),center); } public void setMyCenterTitle(@StringRes int Rid) { setMyCenterTitle(this.getContext().getText(Rid)); } public void setMyCenterTitle(CharSequence text) { Context context = this.getContext(); if (this.mCenterTitle == null) { this.mCenterTitle = new TextView(context); ... } else { if (this.mCenterTitle.getVisibility() != VISIBLE) { mCenterTitle.setVisibility(VISIBLE); } } if (mCenterIcon != null && mCenterIcon.getVisibility() != GONE) { mCenterIcon.setVisibility(GONE); } ... } public CustomToolBar setMyCenterTitle(CharSequence text,boolean center) { Context context = this.getContext(); if (this.mCenterTitle == null) { this.mCenterTitle = new TextView(context); ... } else { if (this.mCenterTitle.getVisibility() != VISIBLE) { mCenterTitle.setVisibility(VISIBLE); } } if (mCenterIcon != null && mCenterIcon.getVisibility() != GONE) { mCenterIcon.setVisibility(GONE); } if (!center) { setTitle(text); setTitleTextColor(getResources().getColor(R.color.black)); } else { mCenterTitle.setText(text); mCenterTitle.setTextColor(getResources().getColor(R.color.black)); mCenterTitle.setTextSize(16); } return this; } public void setMyCenterTextAppearance(Context context,@StyleRes int resId) { if (this.mCenterTitle != null) { this.mCenterTitle.setTextAppearance(context,resId); } } public void setMyCenterTextColor(@ColorInt int color) { if (this.mCenterTitle != null) { this.mCenterTitle.setTextColor(color); } } public void setMyCenterTextOnClickListener(OnClickListener listener) { if (mCenterTitle != null) { mCenterTitle.setOnClickListener(listener); } } public void setMyCenterIcon(@DrawableRes int resId) { setMyCenterIcon(ContextCompat.getDrawable(this.getContext(),resId)); } public void setMyCenterIcon(Drawable drawable) { Context context = this.getContext(); if (this.mCenterIcon == null) { ... } else { if (mCenterIcon.getVisibility() != VISIBLE) { mCenterIcon.setVisibility(VISIBLE); } } if (mCenterTitle != null && mCenterTitle.getVisibility() != GONE) { mCenterTitle.setVisibility(GONE); } setTitle(""); mCenterIcon.setImageDrawable(drawable); } public void setMySettingText(@StringRes int Rid) { setMySettingText(this.getContext().getText(Rid)); } public void setMySettingText(CharSequence text) { Context context = this.getContext(); if (this.mSettingText == null) { ... } else { if (mSettingText.getVisibility() != VISIBLE) { mSettingText.setVisibility(VISIBLE); } } if (mSettingIcon != null && mSettingIcon.getVisibility() != GONE) { mSettingIcon.setVisibility(GONE); } mSettingText.setText(text); mSettingText.setTextSize(14); mSettingText.setTextColor(getResources().getColor(R.color.toolbar_title)); } public void setMySettingTextAppearance(Context context,@StyleRes int resId) { if (mSettingText != null) { mSettingText.setTextAppearance(context,resId); } } public void setMySettingTextColor(@ColorInt int color) { if (mSettingText != null) { mSettingText.setTextColor(color); } } public void setSettingTextOnClickListener(OnClickListener listener) { if (mSettingText != null) { mSettingText.setOnClickListener(listener); } } public CustomToolBar setMySettingIcon(@DrawableRes int resId) { return setMySettingIcon(ContextCompat.getDrawable(this.getContext(),resId)); // ViewConfiguration.get(this.getContext()).getScaledTouchSlop(); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public CustomToolBar setMySettingIcon(Drawable drawable) { Context context = this.getContext(); if (this.mSettingIcon == null) { ... } else { if (mSettingIcon.getVisibility() != VISIBLE) { mSettingIcon.setVisibility(VISIBLE); } } if (mSettingText != null && mSettingText.getVisibility() != GONE) { mSettingText.setVisibility(GONE); } mSettingIcon.setImageDrawable(drawable); return this; } public void setSettingIconOnClickListener(OnClickListener listener) { if (mSettingIcon != null) { mSettingIcon.setOnClickListener(listener); } } private void addSimpleView(View v,int gravity) { addSimpleView(v,gravity,0); } private void addSimpleView(View v,int gravity,int left,int top,int right,int bottom) { LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,gravity); lp.setMargins(left,top,right,bottom); this.addView(v,lp); } private void addMyView(View v,int gravity) { addMyView(v,dp2px(this,16),0); } private void addMyView(View v,int bottom) { LayoutParams lp = new LayoutParams(dp2px(this,20),lp); } private void addMyView(View v,int bottom,int width) { LayoutParams lp = new LayoutParams(dp2px(this,width),20,lp); } public CustomToolBar setCenterTitleWithImg(CharSequence text,Drawable drawable,boolean center) { Context context = this.getContext(); if (this.mCenterTitle == null) { this.mCenterTitle = new TextView(context); ... if (this.mCenterTitle.getVisibility() != VISIBLE) { mCenterTitle.setVisibility(VISIBLE); } } if (this.mCenterIcon == null) { this.mCenterIcon = new ImageView(context); ... } else { if (mCenterIcon.getVisibility() != VISIBLE) { mCenterIcon.setVisibility(VISIBLE); } } mCenterTitle.setTextSize(18); mCenterTitle.setTextColor(getResources().getColor(R.color.black)); mCenterTitle.setText(text); mCenterIcon.setImageDrawable(drawable); return this; } public void setCenterTitleWithImgOnClickListener(OnClickListener listener) { if (mCenterTitle != null) { ((View) mCenterTitle.getParent()).setOnClickListener(listener); } } }
2、自定義Toolbar使用
1)、res/layout建立佈局檔案
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <com.ktx.view.CustomToolBar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?actionBarSize" android:background="@android:color/white" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:titleTextColor="@android:color/black" /> </FrameLayout>
2)、在佈局中使用
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:binding="http://schemas.android.com/tools"> <data> <variable name="viewModel" type="com.android.playandroid.viewmodel.LoginViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/bkg" android:orientation="vertical"> <include layout="@layout/title_layout" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> ... </androidx.constraintlayout.widget.ConstraintLayout> </layout>
3)、程式碼中使用
a、初始化:
mBinding.root.toolbar.setNavigationIcon(R.mipmap.register_close) mBinding.root.toolbar.setMyCenterTitle(getString(R.string.register),true) mBinding.root.toolbar.setMySettingText(getString(R.string.login))
b、點選事件:
mBinding.root.toolbar.setNavigationOnClickListener { .... } mBinding.root.toolbar.setSettingTextOnClickListener { ... }
4)、沉浸式,設定toolbar背景顏色、文字顏色,一般寫在基類
protected open fun initImmersionBar() { //在BaseActivity裡初始化 mImmersionBar = ImmersionBar.with(this) if (toolbar != null) { mImmersionBar.titleBar(toolbar) } mImmersionBar.statusBarDarkFont(true) // mImmersionBar.keyboardEnable(true).navigationBarWithKitkatEnable(false).init() // mImmersionBar.init() ImmersionBar.with(this).init() }
Google原生的效果,不必多說,可以實現類似這樣的效果
注意:
1、配置整個app的toolbar風格,在/value/styles.xml檔案修改程式碼
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@android:color/white</item> <item name="colorPrimaryDark">@android:color/white</item> <item name="colorAccent">@android:color/white</item> ... </style>
2、修改了 toolbar的高度 ,怎麼讓navigationIcon顯示在toolbar中心?
只要設定如下,即可:android:minHeight="@dimen/toolbar_height"
3、toolbar佈局檔案位置
如果在commonlibrary目錄建立該檔案,在app 下還需要複製一份,因為在app 使用toolbar,kotlin-android-extensions引用不到commonlibrary目錄下的佈局檔案。
程式碼Github:https://github.com/AlbertShen0211/PlayAndroid
總結
到此這篇關於Android自定義ToolBar並實現沉浸式的文章就介紹到這了,更多相關Android 自定義ToolBar並沉浸式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!