前一段时间,项目中有一个页面,如图所示 图片中的最下方的按钮,取消预约,这两个按钮,在正常的页面中是正常显示的,但是会出现头部的ToolBar
前一段时间,项目中有一个页面,如图所示
图片中的最下方的按钮,取消预约,这两个按钮,在正常的页面中是正常显示的,但是会出现头部的ToolBar会被顶出页面,也就是在弹出输入框的时候,然后测试小伙伴就给我提了bug,没有办法,只好去寻找解决办法;
1.最开始寻找的解决办法,就是在AndroidMnifest,清淡文件中加入
"
android:windowsoftInputMode="adjustPan|stateHidden"
在 ViewTreeObserver 中,包含了以下几个接口:
interface ViewTreeObserver.OnGlobalFocusChangeListener
interface ViewTreeObserver.OnGlobalLayoutListener
interface ViewTreeObserver.OnPreDrawListener
interface ViewTreeObserver.OnScrollChangedListener
interface ViewTreeObserver.OnTouchModeChangeListener
具体的使用方法
View decorView = getWindow().getDecorView();
View contentView = findViewById(Window.ID_ANDROID_CONTENT);
decorView.getViewTreeObserver().addOnGlobalLayoutListener(getGlobalLayoutListener(decorView, contentView));
在这里开始进行监听的编写,然后实现对应的监听方法,对其中的对应的数据contentView.setPadding,设置好他的偏移量,这样就可以在弹出输入框的时候,不会让我们的toolbar被顶上去,也不会遮挡住我们的EditText,而且按钮也不会被遮盖
private ViewTreeObserver.OnGlobalLayoutListener getGlobalLayoutListener(final View decorView, final View contentView) {
return () -> {
Rect r = new Rect();
decorView.getWindowVisibleDisplayFrame(r);
int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
int diff = height - r.bottom;
if (diff != 0) {
if (contentView.getPaddingBottom() != diff) {
contentView.setPadding(0, 0, 0, diff);
} else {
contentView.setPadding(0, 0, 0, 0);
}
};
}
然后在我以为大功告成的时候,我们的测试小伙伴又提bug了,在小米的刘海屏手机上
这两个按钮,只展示了头部的一丢丢,取消 和预约按钮的字基本都看出出来;这就很烦人,但是没有办法之后继续加判断
这里获取是不是小米的机型判断
public static boolean isMiui() {
String manufacturer = Build.MANUFACTURER;
//这个字符串可以自己定义,例如判断华为就填写huawei,魅族就填写meizu
return !"xiaomi".equalsIgnoreCase(manufacturer);
}
然后在ViewTreeObserver之中加上相关的判断,然后大功告成
private ViewTreeObserver.OnGlobalLayoutListener getGlobalLayoutListener(final View decorView, final View contentView) {
return () -> {
Rect r = new Rect();
decorView.getWindowVisibleDisplayFrame(r);
int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
int diff = height - r.bottom;
if (diff != 0) {
if (contentView.getPaddingBottom() != diff) {
if (isMiui()) {
contentView.setPadding(0, 0, 0, diff);
}else{
contentView.setPadding(0, 0, 0, 0);
}
}
} else {
if (contentView.getPaddingBottom() != 0) {
contentView.setPadding(0, 0, 0, 0);
}
}
};
}
开始以为ViewTreeObserver,这个看起来肯定很难,毕竟看起来好像很难的样子,但是实际使用时,沉下心,一切问题就有不太大了.
--结束END--
本文标题: Android :使用ViewTreeObserver进行监听测绘页面
本文链接: https://lsjlt.com/news/29626.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0