Не удается отобразить всплывающее окно вне представления клавиатуры в Android Pie

Я делаю клавиатуру, которая показывает popupWindow языков. На всех устройствах я получаю идеальный popupWindow вне клавиатуры, но только в Android Pie я не могу отображать popupWindow вне клавиатуры.

Я хочу показывать всплывающее окно за пределами candidateView клавиатуры, когда клавиатура Bluetooth подключена.

я использую этот код

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

У кого-нибудь есть идеи, в чем проблема?

вот демонстрационное приложение - https://github.com/priyankagb/andoidpiepopupwindowdemo

посмотреть скриншоты,

В Android Pie вы можете увидеть небольшую строку внизу, которая popupWindow для языков

Слева ниже пирога, справа пирог


person Priyanka    schedule 04.07.2019    source источник
comment
Попробуйте вручную установить ширину и высоту всплывающего окна, используя методы setWidth() и setHeight()   -  person Syed Ahmed Jamil    schedule 07.07.2019
comment
да, я пробовал это, но безрезультатно.   -  person Priyanka    schedule 08.07.2019
comment
Судя по тому, как это выглядит, всплывающее окно изначально не раздувается. Потому что, если бы он был за клавиатурой, мы бы все равно могли его видеть, верно?   -  person Syed Ahmed Jamil    schedule 08.07.2019
comment
вы можете видеть всплывающее окно в круговой диаграмме под флажком (маленькая белая линия), но в нижней круговой диаграмме всплывающее окно автоматически устанавливает свое положение на верхней стороне, но этого не происходит в Android Pie.   -  person Priyanka    schedule 08.07.2019
comment
Да, я вижу белую линию, но где остальная часть его тела, если оно на самом деле надулось. Я предполагаю, что в Pie он вообще не раздувается. Попробуйте создать пустой проект, ориентированный только на Pie, и просто отобразите простое всплывающее окно, используя аналогичный код, который вы написали ранее, и посмотрите, работает ли он.   -  person Syed Ahmed Jamil    schedule 08.07.2019
comment
его макет раздувается, я проверил, сделав высоту клавиатуры больше, чем высота макета всплывающих окон, чем я могу видеть полное всплывающее окно под флагом   -  person Priyanka    schedule 08.07.2019
comment
обратите внимание, что представление, отображаемое для прогнозирования, является кандидатом на представление клавиатуры   -  person Priyanka    schedule 08.07.2019
comment
Я помню, что раньше сталкивался с проблемой Gravity.NO_GRAVITY, но точно не помню. В вашем случае, я думаю, вы можете попробовать использовать Gravity.TOP, надеюсь, это поможет   -  person Linh    schedule 08.07.2019
comment
@PhanVanLinh, я пробовал это, но не работает   -  person Priyanka    schedule 08.07.2019
comment
есть ли у вас простой демонстрационный проект для этой проблемы, если у вас есть, вы можете поделиться демонстрацией с вопросом, и мы можем попытаться найти   -  person Linh    schedule 08.07.2019
comment
Нет, у меня нет   -  person Priyanka    schedule 08.07.2019
comment
@PhanVanLinh, я создал демонстрационное приложение, посмотрите эту ссылку. github.com/priyankagb/andoidpiepopupwindowdemo   -  person Priyanka    schedule 08.07.2019
comment
@Priyankagb, в вашем примере, зачем вам это if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) popupWindowAbove.setHeight(RelativeLayout.LayoutParams.WRAP_CONTENT);. если вы удалите эту проверку, ваше всплывающее окно будет отображаться правильно   -  person Linh    schedule 08.07.2019
comment
да, он будет отображаться правильно, но только в демоверсии, все еще в моем приложении, у меня возникла проблема. Удалив эту строку, теперь всплывающее окно отображается вверх, но не показывает всплывающее окно полностью, это всего лишь небольшая линия над флагом. см. этот снимок экрана — ibb.co/MD14SPg   -  person Priyanka    schedule 08.07.2019
comment
@PhanVanLinh посмотрите, что произойдет, когда я изменю высоту candidateView ibb.co/VNjTJv4   -  person Priyanka    schedule 08.07.2019
comment
@Priyankagb, не могли бы вы снова воспроизвести это в своей демонстрации. Я могу помочь тебе исправить это   -  person Linh    schedule 08.07.2019
comment
Ok. Дай мне попробовать.   -  person Priyanka    schedule 08.07.2019
comment
@PhanVanLinh Я отправил код на Github. Пожалуйста, проверьте последний код. Та же проблема с клавиатурой. Я сделал клавиатуру на заказ. Пожалуйста, выберите andoidpiepopupwindowdemo клавиатуру для тестирования. Всплывающее окно откроется при нажатии значка настройки представления кандидата.   -  person Priyanka    schedule 08.07.2019
comment
@PhanVanLinh, у тебя есть какое-нибудь решение?   -  person Priyanka    schedule 09.07.2019
comment
Еще нет. Я вижу проблему, но до сих пор не нашел для нее решения.   -  person Linh    schedule 09.07.2019
comment
@PhanVanLinh видит, что TextView можно щелкнуть в демоверсии, но они нам не показываются. Странный!!!!   -  person Priyanka    schedule 10.07.2019
comment
Да. Не знаю, что не так с Android Pie. Я вижу, что мы не можем отображать всплывающее окно вне клавиатуры. Я думаю, вы можете сделать демонстрационный проект более простым (удалить все лишнее) и отправить проблему в систему отслеживания проблем Google.   -  person Linh    schedule 10.07.2019


Ответы (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

person Priyanka    schedule 15.07.2019

Добавьте следующий код, где будет отображаться ваше всплывающее окно.

[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] своими представлениями.

person Bahman6982    schedule 14.07.2019
comment
Tx для ответа, но это бесполезно для меня, я уже правильно показываю всплывающее окно выше и ниже, но вопрос в том, почему в Android Pie я не могу отображать всплывающее окно с клавиатуры. - person Priyanka; 15.07.2019