本文最后更新于 684 天前,其中的信息可能已经有所发展或是发生改变。
最近在做项目的时候,有朋友提出来要求适配一下手势线,但是在搜索引擎逛了一圈,都没发现合适的解决方案,于是自己稍微摸索了一下,虽然达到了效果,可能还有更好的方法,这里就简单记录一下。
首先来到themes.xml中,在你的主题里面加上下面这行
<item name="android:windowTranslucentNavigation">true</item>
这一行生效的话,你的导航栏就变成透明的了,也就是说toolbar和navigationBar都将会在手机屏幕的最上端或最下端。
这样已经实现了让小白条沉浸,但是toolbar被状态栏覆盖了,所以接下来我们可以用padding或者margin来把toolbar调整到状态栏之下。
要获取状态栏或导航栏的高度,可以用如下两个方法
// 获取状态栏高度
public static int getStatusBarHeight(Activity activity) {
@SuppressLint("InternalInsetResource")
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
return activity.getResources().getDimensionPixelOffset(resourceId);
}
return 0;
}
// 获取导航栏高度
public static int getNavigationBarHeight(Activity activity) {
@SuppressLint("InternalInsetResource")
int resourceId = activity.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return activity.getResources().getDimensionPixelOffset(resourceId);
}
return 0;
}
然后再写一个通用的方法以便后续调用
public static Toolbar autoSetToolBarPaddingTop(Activity activity, Toolbar toolbar) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams();
params.setMargins(params.leftMargin, getStatusBarHeight(activity), params.rightMargin, params.bottomMargin);
toolbar.setLayoutParams(params);
return toolbar;
}
这样,我们只需要在toolbar初始化之后调用,toolbar就自动调整位置了。
到这里,就已经实现了我们所需要的效果,但是还有一个小问题需要解决。
如果你的页面中含有BottomNavigation的话,如果用户的手机不支持小白条,而是传统的三键导航栏,对于BottomNavigation的显示可能会有一些小问题,如下所示。
要解决这个问题,还记得我们上面也顺带提到了获取导航条的高度么,接下来就需要用它来设置padding了。
public static void autoSetNavigationBarPaddingBottom(Activity activity, View view) {
int height = getNavigationBarHeight(activity);
ViewCompat.setOnApplyWindowInsetsListener(activity.getWindow().getDecorView(), (v, insets) -> {
boolean isShowing = false;
int naviHeight = 0;
if (insets != null) {
naviHeight = insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom;
isShowing = Math.abs(naviHeight - height) <= 5;
}
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
view.setLayoutParams(params);
if (isShowing) {
params.height = activity.getResources().getDimensionPixelSize(R.dimen.bottom_nav_height) + getNavigationBarHeight(activity);
}else {
params.height = activity.getResources().getDimensionPixelSize(R.dimen.bottom_nav_height);
}
if (insets != null) {
return ViewCompat.onApplyWindowInsets(v, insets);
}
return null;
});
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
params.height = params.height + getNavigationBarHeight(activity);
view.setLayoutParams(params);
}
将代码中的R.dimen.bottom_nav_height改成你需要的高度即可,这个方法主要用于检测用户屏幕是否显示导航栏,以此来动态调整高度。
最后综合一下,来看看实际效果如何。