无法在 Android Pie 的键盘视图外显示弹出窗口 window
Can not show popup window out of the keyboard view in Android Pie
我正在制作一个显示 popupWindow
种语言的键盘。在所有设备中,我在键盘之外得到了完美的 popupWindow
但只有在 Android Pie 中,我无法在键盘之外显示 popupWindow
。
我想在连接蓝牙键盘时在键盘 candidateView
之外显示弹出窗口。
我正在使用这个代码
setClippingEnabled(false);
showAtLocation(anchor, Gravity.NO_GRAVITY, x, y);
有人知道吗,问题是什么?
这是演示应用程序 - https://github.com/priyankagb/andoidpiepopupwindowdemo
查看屏幕截图,
在 Android 饼图中,您可以在其中看到底部的一条小线 popupWindow
用于语言
左边是饼图,右边是饼图
在弹出窗口将显示的位置添加以下代码
[view].getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
public void onGlobalLayout(){
int screenHeight = [view].getRootView().getHeight();
Rect r = new Rect();
View view = getWindow().getDecorView();
view.getWindowVisibleDisplayFrame(r);
int keyBoardHeight = screenHeight - r.bottom;
if ( keyBoardHeight > 150 ){
// keyboard is showing, set popup window above keyboard height
} else {
// keyboard gone, restore popup window location to center screen
}
}
});
Replace [view]
with your views
是的,我已经通过更改键盘布局文件解决了我的问题
我在候选视图上方添加了一个虚拟视图
喜欢...
<androidx.constraintlayout.widget.ConstraintLayout 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">
<View
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/rlPredictionView" />
<RelativeLayout
android:id="@+id/rlPredictionView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_with_shadow_prediction_bar"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
...
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
而不是在 InputMethodService
class
中覆盖此方法
@Override
public void onComputeInsets(InputMethodService.Insets outInsets) {
super.onComputeInsets(outInsets);
outInsets.visibleTopInsets = candidateView.getRelativeView().getTop();
outInsets.contentTopInsets = candidateView.getRelativeView().getTop();
}
上方的虚拟视图 rlPredictionView
将设置 visibleTopInsets
键盘,在此区域,弹出窗口将显示
此虚拟视图将允许通过触摸访问背景视图,因此用户将看不到它
参考 -
我正在制作一个显示 popupWindow
种语言的键盘。在所有设备中,我在键盘之外得到了完美的 popupWindow
但只有在 Android Pie 中,我无法在键盘之外显示 popupWindow
。
我想在连接蓝牙键盘时在键盘 candidateView
之外显示弹出窗口。
我正在使用这个代码
setClippingEnabled(false);
showAtLocation(anchor, Gravity.NO_GRAVITY, x, y);
有人知道吗,问题是什么?
这是演示应用程序 - https://github.com/priyankagb/andoidpiepopupwindowdemo
查看屏幕截图,
在 Android 饼图中,您可以在其中看到底部的一条小线 popupWindow
用于语言
左边是饼图,右边是饼图
在弹出窗口将显示的位置添加以下代码
[view].getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
public void onGlobalLayout(){
int screenHeight = [view].getRootView().getHeight();
Rect r = new Rect();
View view = getWindow().getDecorView();
view.getWindowVisibleDisplayFrame(r);
int keyBoardHeight = screenHeight - r.bottom;
if ( keyBoardHeight > 150 ){
// keyboard is showing, set popup window above keyboard height
} else {
// keyboard gone, restore popup window location to center screen
}
}
});
Replace
[view]
with your views
是的,我已经通过更改键盘布局文件解决了我的问题
我在候选视图上方添加了一个虚拟视图
喜欢...
<androidx.constraintlayout.widget.ConstraintLayout 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">
<View
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/rlPredictionView" />
<RelativeLayout
android:id="@+id/rlPredictionView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_with_shadow_prediction_bar"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
...
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
而不是在 InputMethodService
class
@Override
public void onComputeInsets(InputMethodService.Insets outInsets) {
super.onComputeInsets(outInsets);
outInsets.visibleTopInsets = candidateView.getRelativeView().getTop();
outInsets.contentTopInsets = candidateView.getRelativeView().getTop();
}
上方的虚拟视图 rlPredictionView
将设置 visibleTopInsets
键盘,在此区域,弹出窗口将显示
此虚拟视图将允许通过触摸访问背景视图,因此用户将看不到它
参考 -