Отже, у мене є, здається, загальна проблема, яка полягає в тому, що EditText у моєму діалоговому вікні не відображається, коли він фокусується. Я бачив кілька обхідних шляхів, наприклад, у цій темі , цій і цій (і багато інших), але я ніколи не бачив задовільного пояснення, чому це відбувається в першу чергу.
Я б набагато віддав перевагу, щоб андроїд використовував власну поведінку за замовчуванням для 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>
Код, який будує це, встановлює видимість relaLayout на "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 не спрацьовує в першу чергу, і чому це здається, це так буденно!