Итак, у меня есть то, что кажется общей проблемой, а именно то, что EditText в моем диалоговом окне не отображается, когда он получает фокус. Я видел несколько обходных путей, например, в этой ветке , в этом и в этом (и во многих других), но я никогда не видел удовлетворительного объяснения того, почему это вообще происходит.
Я бы предпочел, чтобы Android использовал свое собственное поведение по умолчанию для EditTexts, чем создавать мое собственное, но похоже, что все (в этих потоках) приняли, что поведение по умолчанию для EditTexts в диалогах - просто указывать курсор, а не клавиатуру. Почему это могло быть?
Для записи, ни один из этих обходных путей, похоже, у меня не работает - самое близкое, что я смог найти, - это заставить клавиатуру появляться под диалоговым окном (с помощью InputMethodManager.toggleSoftKeyboard (*)). Моя конкретная конфигурация - API15, EditText отображается в нижнем колонтитуле ListView в AlertDialog. EditText андроид: фокусируемый = «истинный» установлен, и onFocusChangeListener будет получать фокус события.
Редактировать:
По запросу, вот конкретный фрагмент кода, с которым я работаю. Я не буду беспокоиться обо всем макете, но в этом конкретном приложении EditText появляется в ответ на нажатие кнопки в диалоговом окне (аналогично представлению действий ). Он содержится в RelativeLayout, для которого по умолчанию видимость "пропала":
<RelativeLayout
android:id="@+id/relLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<ImageButton
android:id="@+id/cancelBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/cancelButton"
android:layout_margin="5dp"/>
<ImageButton
android:id="@+id/okBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/cancelBut"
android:background="@color/transparent"
android:src="@drawable/okButton"
android:layout_margin="5dp" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:focusable="true"
android:layout_toLeftOf="@id/okBut"/>
</RelativeLayout>
Код, который создает это, устанавливает видимость relativeLayout на «Visible» (и скрывает другие элементы пользовательского интерфейса). Этого должно быть достаточно, чтобы поднять клавиатуру, когда EditText сфокусируется, исходя из моего опыта работы с EditText. Однако по некоторым причинам это не так. Я могу установить следующее onFocusChangeListener:
edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// For whatever reason we need to request a soft keyboard.
InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
if(hasFocus)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
}
}
});
Используя эту конфигурацию, когда я впервые вхожу в EditText, срабатывает onFocusChangedListener и генерирует журнал, который неизменно выглядит следующим образом:
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
Клавиатура появляется, а затем исчезает, вероятно, потому, что я переключаю ее дважды, но даже когда я проверяю, что она остается включенной, она находится за диалоговым окном (в серой области), и нет способа добраться до нее, не закрывая диалоговое окно. .
Тем не менее, я хотел бы подчеркнуть, что, хотя я могу заставить этот обходной путь работать, меня в первую очередь интересует найти простую причину, по которой EditText вообще не запускается, и почему это кажется таким банальным!