无法在 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 键盘,在此区域,弹出窗口将显示

此虚拟视图将允许通过触摸访问背景视图,因此用户将看不到它

参考 -