Итак, у меня есть, как мне кажется, общая проблема, которая заключается в том, что EditText в моем диалоговом окне не отображается, когда он получает фокус. Я видел несколько обходных путей, таких как этот поток , этот и этот (и многие другие), но я никогда не видел удовлетворительного объяснения для почему это происходит в первую очередь.
Я бы предпочел, чтобы android использовал свое собственное поведение по умолчанию для EditTexts, чем для создания своего собственного, но кажется, что все (в этих потоках) согласились с тем, что поведение по умолчанию для EditTexts в диалогах - просто дать курсор и нет клавиатуры. С чего бы это?
Для справки, ни один из этих обходных путей, кажется, не работает для меня - самое близкое, что я смог сделать, это заставить клавиатуру появиться под диалоговым окном (используя 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>
Код, который создает это, устанавливает видимостьlativeLayout на «Видимый» (и скрывает другие элементы пользовательского интерфейса). Этого должно быть достаточно, чтобы поднять клавиатуру, когда 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 не срабатывает в первую очередь, и почему это кажется таким обычным делом!