无法在Android Pie的键盘视图中显示弹出窗口

时间:2019-07-04 11:56:34

标签: android popupwindow android-9.0-pie

我正在制作一个显示popupWindow种语言的键盘。在所有设备中,我都能在键盘外获得完美的popupWindow,但在Android Pie中却无法在键盘外显示popupWindow

我想在连接蓝牙键盘时在键盘candidateView之外显示弹出窗口。

我正在使用此代码

setClippingEnabled(false);
showAtLocation(anchor, Gravity.NO_GRAVITY, x, y);

有人有什么想法吗,这是什么问题?

这是演示应用-https://github.com/priyankagb/andoidpiepopupwindowdemo

查看屏幕截图

在Android Pie中,您可以在底部看到一小行,对于语言是popupWindow

左在饼下面,右在饼

2 个答案:

答案 0 :(得分:2)

是的,我已经通过更改键盘的布局文件解决了问题

我在候选视图上方添加了一个虚拟视图

喜欢...

<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类中重写此方法

 @Override
    public void onComputeInsets(InputMethodService.Insets outInsets) {
        super.onComputeInsets(outInsets);
        outInsets.visibleTopInsets = candidateView.getRelativeView().getTop();
        outInsets.contentTopInsets = candidateView.getRelativeView().getTop();
    }

rlPredictionView上方的虚拟视图将设置键盘visibleTopInsets,并在此区域显示弹出窗口

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

参考-https://stackoverflow.com/a/53326786/10989990

答案 1 :(得分:0)

在您的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
                }
            }
        });
  

用您的视图替换[view]