Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WindowInsetListener在Android R中的偏移量加倍(Api 30)_Java_Android_Android Softkeyboard_Windowinsets - Fatal编程技术网

Java WindowInsetListener在Android R中的偏移量加倍(Api 30)

Java WindowInsetListener在Android R中的偏移量加倍(Api 30),java,android,android-softkeyboard,windowinsets,Java,Android,Android Softkeyboard,Windowinsets,我编写了一个键盘动画,使控件(任何视图)跟随软键盘的滑入和滑出动画。 在安卓10及以下版本中,一切正常 我从上一篇(同时)过时的文章(在Android 11之前写的,不幸的是用Kotlin写的,它也不太关心不推荐的方法)中得到了这个想法,但是翻译成Java效果很好——剩下的唯一问题是Api30+ 在Android 11中,当动画结束时,WindowInsetListener(或delayedTransition,我不知道是什么导致了这个问题)似乎将偏移量增加了一倍(即第二次将软键盘的全高添加到视

我编写了一个键盘动画,使控件(任何视图)跟随软键盘的滑入和滑出动画。 在安卓10及以下版本中,一切正常

我从上一篇(同时)过时的文章(在Android 11之前写的,不幸的是用Kotlin写的,它也不太关心不推荐的方法)中得到了这个想法,但是翻译成Java效果很好——剩下的唯一问题是Api30+

在Android 11中,当动画结束时,
WindowInsetListener
(或
delayedTransition
,我不知道是什么导致了这个问题)似乎将偏移量增加了一倍(即第二次将软键盘的全高添加到视图边界)

看看这两个gif显示的差异(对不起,质量太差了,我不太喜欢录像)

两台设备上运行的代码相同

左侧安卓10,右侧安卓11

下面是听众:

类WindowInsetsListener实现View.OnApplyWindowInsetsListener{
私有最终键盘animationListener animationListener;
private int previousOffset=0;
WindowInsetsListener(键盘animationListener animationListener){
this.animationListener=animationListener;
}
@凌驾
应用程序窗口插图上的公共窗口插图(视图设计视图、窗口插图插图){
窗口插入结果=插入;
int offset=insets.getSystemWindowInsetBottom()=Build.VERSION\u code.R){
返回WindowInsets.consumered;
}
}
返回应用程序窗口插图上的decorView(结果);
}
专用窗口插图(窗口插图插图){
Rect insetRect=新Rect(
insets.getSystemWindowInsettleft(),
insets.getSystemWindowInsetTop(),
insets.getSystemWindowInsetRight(),
Math.min(insets.getSystemWindowInsetBottom(),insets.getStableInsetBottom());
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.Q){
插图新建插图=插图编号(插图编号);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.R){
返回新的WindowInsets.Builder()。
setInsets(WindowInsets.Type.systembar(),newInsets.build();
}否则{
返回新的WindowInsets.Builder()。
setSystemWindowInsets(newInsets.build();
}
}否则{
返回insets.replaceSystemWindowInsets(insetRect);
}
}
以下是从侦听器调用的动画方法:

@覆盖
公共布尔动画(@NonNull视图,int偏移){
ViewGroup group=getGroup(view);//搜索层次结构,直到找到该组为止
如果(组!=null){
TransitionManager.beginDelayedTransition(组、边界);
setBottomPadding(视图、偏移);
返回true;
}
返回false;
}
受保护的void setbottomadding(视图、int偏移){
view.setPadding(
view.getPaddingLeft(),
view.getPaddingTop(),
view.getPaddingRight(),
抵消);
}
我试图通过版本来尊重所有的反对意见。尤其是Android的这一部分在每个版本中都发生了变化。但即使我删除了Api 29和30的“新”实现,并且使用了不赞成的
.replaceSystemWindowInsets
方法,效果仍然是一样的

有没有人对Api 30+中需要提供的附加标志或其他内容有什么想法