Не удается отобразить всплывающее окно из вида клавиатуры в Android Pie - PullRequest
14 голосов
/ 04 июля 2019

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

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

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

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

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

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

см. Скриншоты,

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

Слева под пирогом, справа - пирог

image image

Ответы [ 2 ]

2 голосов
/ 15 июля 2019

Да, я решил свою проблему, изменив файл раскладки клавиатуры

Я добавил один фиктивный вид над кандидатом

как ...

<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

0 голосов
/ 14 июля 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] вашими взглядами

...