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

Posted

技术标签:

【中文标题】无法在 Android Pie 的键盘视图中显示弹出窗口【英文标题】:Can not show popup window out of the keyboard view in Android Pie 【发布时间】:2019-11-15 03:58:26 【问题描述】:

我正在制作一个显示popupWindow 语言的键盘。在所有设备中,我在键盘外都得到了完美的popupWindow,但只有在 android Pie 中,我无法在键盘外显示popupWindow

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

我正在使用此代码

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

有人知道,有什么问题吗?

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

查看屏幕截图,

在 Android Pie 中,您可以在底部看到一条小线,即语言的 popupWindow

左边是饼图,右边是饼图

【问题讨论】:

您尝试过使用setWidth()setHeight() 方法手动设置弹出窗口的宽度和高度 是的,我试过了,但没有结果。 从它的外观看来,弹出窗口一开始并没有膨胀。因为如果它在键盘后面,我们仍然可以看到它的一部分吗? 你可以在Pie的flag下方(小白线)看到弹出窗口,但是在下方的pie中,弹出窗口会自动将其位置设置在上侧,但在Android Pie中不会发生这种情况。 @PhanVanLinh,我创建了一个演示应用程序,请参阅此链接。 github.com/priyankagb/andoidpiepopupwindowdemo 【参考方案1】:

在您的 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]

【讨论】:

Tx 回答,但它对我没有用,我已经在上方和下方正确显示弹出窗口,但问题是为什么在 Android Pie 中我无法从键盘显示弹出窗口。跨度> 【参考方案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_
    android:layout_>

    <View
        android:layout_
        android:layout_
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/rlPredictionView" />

    <RelativeLayout
        android:id="@+id/rlPredictionView"
        android:layout_
        android:layout_
        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://***.com/a/53326786/10989990

【讨论】:

以上是关于无法在 Android Pie 的键盘视图中显示弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

图像视图在android中的键盘弹出窗口上缩小

避免 android 软键盘调整布局大小。或回调隐藏视图

如何在Android中判断软键盘是不是弹出或隐藏

在自定义视图上显示弹出菜单时不要关闭键盘

android键盘弹出问题

防止在presentViewController上隐藏键盘(显示弹出窗口)