Причина:
Я отслеживаю причину ошибки вплоть до автоматического исправления правописания на некоторых телефонах (Moto Droid Razr и несколько других Moto Phones) и некоторых android Rom (например, некоторые CM7 и CM7.1 ROMS). Если в тексте есть слово, которое неправильно написано, и текстовый курсор зависает в тексте или рядом с ним, ОС Android попытается автоматически вызвать клавиатуру и попытаться предоставить предложения по правильному написанию.
На большинстве устройств поле с правильной настройкой по умолчанию отображается только как однострочный сегмент над клавиатурой. Однако на некоторых пользовательских ПЗУ (CM7 - это один из них, с которым я часто сталкиваюсь) и некоторые устройства (Droid Razr), появляется дополнительный раскрывающийся список:
Посмотрите на это изображение того, как выглядит автозаполнение всплывающего окна (извините, что недостаточно для вставки изображения) р>
Я очень подозреваю, что раскрывающийся список с автоматическим исправлением также реализуется как всплывающее окно, и он пытается использовать текущее всплывающее окно (такое, которое содержит EditText с неправильным произношением) в качестве корневого представления, и пытаясь получить windowToken из корневого представления.
Поскольку всплывающее окно не является традиционным представлением, я предполагаю, что он не может дать правильное окноToken другим представлениям, которые их запрашивают, что приводит к ошибке.
Решения:
1) Самый простой способ решить эту проблему - использовать Dialog вместо всплывающих окон. Их API очень похож, и в моих случаях довольно легко заменить PopupWindow с помощью Dialog.
Например:
Старый код:
LayoutInflater inflater = (LayoutInflater) parentActivity.getLayoutInflater();
View mainView = parentActivity.findViewById(R.id.main_calendar_fragment);
updateEventPopupWindow = new PopupWindow(inflater.inflate(
R.layout.add_event_fragment, null, false), metrics.widthPixels, metrics.heightPixels, true);
updateEventPopupWindow.setBackgroundDrawable(new BitmapDrawable());
updateEventPopupWindow.showAtLocation(mainView, Gravity.CENTER, 0, 0);
Новый код:
LayoutInflater inflater = (LayoutInflater) parentActivity.getLayoutInflater();
View mainView = parentActivity.findViewById(R.id.main_calendar_fragment);
updateEventDialog = new Dialog(parentActivity, android.R.style.Theme_NoTitleBar);
updateEventDialog.setContentView(inflater.inflate(R.layout.add_event_fragment, (ViewGroup) mainView, false));
updateEventDialog.show();
2) Второй подход сложнее, но может быть подходящим, если замена PopupWindow для Dialog не выполнима, это для пользователя фрагменты вместо PopupWindows. Существует много хороших фрагментов учебных пособий , поэтому я не буду беспокоиться о том, как это сделать в этом сообщении.
3). В крайнем случае, например, как многочисленные плакаты, упомянутые выше, вы можете отключить автоматический текст текста на поля EditText внутри PopupWindwow, чтобы устранить эту проблему. Однако это приводит к ужасному опыту пользователей, поскольку многие пользователи (и клавиатуры, такие как swype) полагаются на автоматическую коррекцию, поэтому это приведет к отключению пользователя от вашего приложения.
Надеюсь, это поможет другим, кто сталкивается с этой проблемой. Я ударился головой о клавиатуру в течение дня, прежде чем, наконец, решил попробовать подход «Диалог», который, к моему удивлению, довольно легко заменил. Удачи вам