服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android自定义ToolBar并实现沉浸式的方法

Android自定义ToolBar并实现沉浸式的方法

2022-12-15 14:56Albert0211 Android

这篇文章主要给大家介绍了关于Android自定义ToolBar并实现沉浸式的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

  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

?
1
2
3
4
5
6
7
8
9
10
<?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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
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创建布局文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   <?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)、在布局中使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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、初始化:

?
1
2
3
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、点击事件:

?
1
2
3
4
5
6
7
8
  mBinding.root.toolbar.setNavigationOnClickListener {
    ....
  }
 
 
  mBinding.root.toolbar.setSettingTextOnClickListener {
    ...
}

4)、沉浸式,设置toolbar背景颜色、文字颜色,一般写在基类

?
1
2
3
4
5
6
7
8
9
10
11
12
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原生的效果,不必多说,可以实现类似这样的效果

Android自定义ToolBar并实现沉浸式的方法

注意:

1、配置整个app的toolbar风格,在/value/styles.xml文件修改代码

?
1
2
3
4
5
6
7
8
9
10
<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并沉浸式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.jianshu.com/p/ba5efb70dc06

延伸 · 阅读

精彩推荐