Android IME: как показать всплывающее диалоговое окно?

Я играю с клавиатурой и пытаюсь показать всплывающее диалоговое окно при нажатии определенной клавиши

if (primaryCode == -301) {
            AlertDialog mDialog = new AlertDialog.Builder(CONTEXT)
            .setTitle("My dialog")
            .setMessage("Lets do it.")
            .setPositiveButton("ok", null).create();
             mDialog.show();
}

Однако проблема заключается в CONTEXT часть. В обычном приложении это было бы просто this, Я тоже пробовал getApplicationContext() а также getBaseContext(), но ни одна из этих работ -> сбой клавиатуры.

android.view.WindowManager $ BadTokenException: невозможно добавить окно - нулевой токен не для приложения

Поэтому мне интересно, нужно ли мне что-то делать с InputConnection:

Интерфейс InputConnection - это канал связи от InputMethod обратно к приложению, которое получает его ввод. Он используется для выполнения таких операций, как чтение текста вокруг курсора, фиксация текста в текстовом поле и отправка необработанных ключевых событий в приложение.

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


Обновить:

Чтобы получить лучшее представление о том, чего я пытаюсь достичь, я загрузил снимок экрана клавиатуры Swype, который делает именно это: показывает всплывающее диалоговое окно, когда на клавиатуре нажимается специальная клавиша.

Swype всплывающее диалоговое окно

5 ответов

Решение

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

решение:

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
alert.show();

удачи.

IME не запускается в контексте приложения, поэтому вы не можете использовать обычные окна приложения. Вы можете использовать диалог, но вам нужно будет изменить его окно так, чтобы тип окна был таким:

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

И установите WindowManager.LayoutParams.token в качестве токена окна IME (через View.getWindowToken()).

Обратите внимание, что диалоговое окно не сможет отображать всплывающие окна, потому что в этом случае оно само по себе является всплывающим окном. Также координатное пространство будет относительно вашего IME, если вы не используете флажки окна, чтобы изменить его.

Выполните действие и в файле манифеста присвойте этому атрибуту атрибут

android:theme="@android:style/Theme.Dialog"

Это очень просто, просто создайте активность как здесь (без всякого представления), напишите в ней код диалога

public class dialog extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to Delete All Contacts?");
    builder.setCancelable(false);

    builder.setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            //deleteAllContacts();
                        }//
                    });

            builder.setNegativeButton("No",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });

    AlertDialog alert = builder.create();
    alert.show();

}
}

Теперь перейдите к файлу манифеста Android и добавьте активность, как,

<activity android:name=".dialog" android:theme="@android:style/Theme.NoDisplay">        </activity>

все, наслаждайся

Вы должны получить ссылку на ваш контекст деятельности. В любом случае, вы должны использовать метод showDialog в Activity.

// 1. CREATE THE DIALOG
val builder: AlertDialog.Builder = AlertDialog.Builder(this, R.style.Theme_AppCompat_Light)
builder.setTitle("Title").setMessage("This is the message for the user. ")
val mDialog = builder.create()

// 2. SET THE IME WINDOW TOKEN ATTRIBUTE WITH THE TOKEN OF THE KEYBOARD VIEW 
mDialog.window?.attributes?.token = this.mTblView.windowToken

// 3. SET THE TYPE OF THE DIALOG TO TYPE_APPLICATION_ATTACHED_DIALOG
mDialog.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG)

// 4. SHOW THE DIALOG 
mDialog.show()
Другие вопросы по тегам