Итак, у меня есть то, что кажется общей проблемой, и что EditText в моем диалоговом окне не появляется, когда он фокусируется. Я видел несколько обходных решений, например этот поток, этот и этот (и многое другое), но я никогда не видел удовлетворительного объяснения, почему это происходит в первую очередь.
Я бы предпочел, чтобы андроид использовал собственное поведение по умолчанию для EditTexts, чем для создания собственного, но похоже, что все (в этих потоках) признали, что поведение по умолчанию для EditTexts в Dialogs - это просто дать курсор и нет клавиатуры. Почему это было бы?
Для записи ни один из этих обходных решений, по-видимому, не работает для меня - ближе всего я смог заставить клавиатуру появиться под диалоговым окном (используя InputMethodManager.toggleSoftKeyboard(*)). Моя конкретная конфигурация - API15, EditText отображается в нижнем колонтитуле ListView в AlertDialog. Установлен параметр EditText android: focusable = "true", а onFocusChangeListener принимает события фокуса.
Edit:
В соответствии с запросом, вот фрагмент кода, с которым я работаю. Я не буду беспокоиться по всему макету, но в этом конкретном приложении 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>
Код, который создает это, устанавливает видимость относительногоLayout в "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 не запускается в первую очередь, и почему это кажется таким обычным явлением!