Диалоговое окно отображения из службы ввода в Android 9 (Android Pie)

Мое приложение включает в себя службу ввода метода со специальной кнопкой, которая вызывает диалог. Для пользователей с Android 9 это диалоговое окно отображается некорректно, видна только часть над IME:

Код для создания диалога

    AlertDialog dialog = builder.create();
    Window window = dialog.getWindow();
    WindowManager.LayoutParams lp = window.getAttributes();
    LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
    lp.token = inputView.getWindowToken();
    lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
    window.setAttributes(lp);
    window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

    dialog.show();

что аналогично описанному в /questions/8794734/kak-zapustit-popupwindow-ili-dialog-iz-sluzhbyi-vvoda/8794743#8794743

Я тоже пробовал TYPE_APPLICATION_PANEL как предложено в /questions/11182359/android-ime-kak-pokazat-vsplyivayuschee-dialogovoe-okno/11182369#11182369 но это тоже не помогает.

Есть ли какое-нибудь легкое решение для этого?

1 ответ

Проблема может быть исправлена ​​с помощью WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG вместо TYPE_APPLICATION_ATTACHED_DIALOG и запроса android.permission.SYSTEM_ALERT_WINDOW.

Подробное изменение здесь: https://github.com/osfans/trime/commit/d8e9da2dfe2653c94cd4aecba00728b7a910cbb8

Если оба PopupWindow и AlertDialog не работают, я думаю, что мы можем использовать плавающее представление, например так:

  1. Настройте вид, сделайте его похожим на диалог.
  2. Используйте WindowManager, чтобы добавить вид, вид будет отображаться поверх любого приложения для Android. Я узнал это из FlowtingExample

Я пытался использовать это. Он работает на Android P. Однако этот метод вызывает серьезные проблемы с глобальными ключами:

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

=> Отображается домашний экран. Но "диалог" и клавиатура все еще отображаются.

(Есть ли способ исправить это ограничение?).

(Я слышал, что диалог выбора языка с клавиатуры Google (Gboard) отлично работает на Android P. Но я не могу найти исходный код Gboard. Есть ли способ его получить?)

Извините, я совсем новичок в stackru, думаю, мне следует опубликовать это в разделе комментариев, но я не могу этого сделать, потому что мне не хватает 50 репутаций.

Другие вопросы по тегам