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, который делает именно это: показывает всплывающее диалоговое окно, когда на клавиатуре нажимается специальная клавиша.
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()