Android IME: отображение настраиваемого всплывающего диалога (например, клавиатуры Swype), который может вводить текст в TextView - PullRequest
5 голосов
/ 18 августа 2010

Мне интересно, как я могу создать собственное всплывающее окно, подобное изображенному на скриншоте ниже (позаимствовано с клавиатуры Swype), где у меня может быть пара кнопок, каждая из которых фиксирует строку в подключенном в данный момент "TextView (через InputConnection ).

Обратите внимание: это InputMethodService , а не обычный Activity. Я уже пытался запустить отдельный Activity с Theme:Dialog. Однако, как только он открывается, я теряю фокус с TextView, и моя клавиатура исчезает (и с этим мой InputConnection исчезает).

Swype

Ответы [ 4 ]

2 голосов
/ 18 августа 2010

Вы можете попробовать использовать PopupWindow.Вам нужно будет немного взломать, чтобы заставить его делать то, что вы хотите, и единственной хорошей документацией для этого является источник.

1 голос
/ 30 сентября 2015

Правильный ответ:

  1. Создайте PopupWindow и поместите в него свой взгляд
  2. Вызов popupWindow.setClippingEnabled (false)
  3. Вызовите [popupWindow.showAtLocation ()] (http://developer.android.com/reference/android/widget/PopupWindow.html#showAtLocation(android.view.View, int, int, int)) с отрицательной координатой Y.

Это покажет ваше всплывающее окно над IMEкак на скриншоте.

1 голос
/ 29 мая 2011

Я тоже бился головой об эту проблему и наконец понял это.Вышеуказанные решения являются правильными, хотя, как вы указали, их нельзя использовать из InputMethodService, потому что это не Activity.Хитрость заключается в создании PopupWindow в подклассе KeyboardView .Используя отрицательную позицию Y, всплывающее окно может появиться над клавиатурой, например Swype.

1 голос
/ 25 ноября 2010

Мир тем, кто следует руководству,

решение:

AlertDialog dialog;

//add this to your code
dialog = builder.create();
Window window = dialog.getWindow(); 

WindowManager.LayoutParams lp = window.getAttributes();
lp.token = mInputView.getWindowToken();
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;

window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
//end addons

dialog.show();

===== ОБНОВЛЕНИЕ 30.09.2015 mInputПросматривайте общее название вашего класса клавиатуры .. см.

@Override
    public View onCreateInputView() {
        mInputView =(MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
....
}

Подробнее: http://developer.android.com/guide/topics/text/creating-input-method.html

удачи.

...