小編這次要給大家分享的是Android如何自定義ToolBar和實現(xiàn)沉浸式,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、阿合奇網(wǎng)站維護、網(wǎng)站推廣。
前言
ToolBar是Android 5.0推出的一個新的導(dǎo)航控件用于取代之前的ActionBar,由于其高度的可定制性、靈活性、具有Material Design風(fēng)格等優(yōu)點,越來越多的App也用上了ToolBar。
沉浸式狀態(tài)欄是從android Kitkat(Android 4.4)開始出現(xiàn)的,它可以被設(shè)置成與APP頂部相同的顏色,這就使得切換APP時,整個界面就好似切換到了與APP相同的風(fēng)格樣式一樣。
依賴包:
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, 0, 0, i, 0, 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, 0, 0, 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, gravity, 0, 0, dp2px(this, 16), 0);
}
private void addMyView(View v, int gravity, int left, int top, int right, int bottom) {
LayoutParams lp = new LayoutParams(dp2px(this, 20),
dp2px(this, 20), gravity);
lp.setMargins(left, top, right, bottom);
this.addView(v, lp);
}
private void addMyView(View v, int gravity, int left, int top, int right, int bottom, int width) {
LayoutParams lp = new LayoutParams(dp2px(this, width),
20, gravity);
lp.setMargins(left, top, right, bottom);
this.addView(v, 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創(chuàng)建布局文件
<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)、沉浸式,設(shè)置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原生的效果,不必多說,可以實現(xiàn)類似這樣的效果

注意:
1、配置整個app的toolbar風(fēng)格,在/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中心
只要設(shè)置如下,即可:android:minHeight="@dimen/toolbar_height"
3、toolbar布局文件位置
如果在commonlibrary目錄創(chuàng)建該文件,在app 下還需要復(fù)制一份,因為在app 使用toolbar,kotlin-android-extensions引用不到commonlibrary目錄下的布局文件。
看完這篇關(guān)于Android如何自定義ToolBar和實現(xiàn)沉浸式的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。
本文標(biāo)題:Android如何自定義ToolBar和實現(xiàn)沉浸式
鏈接分享:http://www.chinadenli.net/article12/gicodc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站收錄、網(wǎng)頁設(shè)計公司、定制開發(fā)、關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)