RequestFocus не работает должным образом для EditText
Много времени было потрачено на решение проблемы, и это выглядит просто, но я действительно устал и не смог найти решение.
У меня есть Activity, активность имеет 4 компонента EditText, у 2 из которых есть всплывающее меню (AlertDialog), которые содержат список, следующий - отключен для редактирования, а последний - доступен для редактирования и должен показывать мягкую клавиатуру, когда пользователь нажав на него.
Кроме того, у моего root LinearLayout есть LinearLayout, которые содержат внутри RelativeLayout. Последнее необходимо для AdvBanner. Последний LinearLayout (RelativeLayout) выровнен по нижней части корневого макета.
Часть XML, которая описывает это:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="bottom"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="bottom">
<RelativeLayout
android:id="@+id/AdvLayoutReserveArea"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="#FFFFFF"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="bottom" />
</LinearLayout>
Когда действие начинается, редактируемый EditText имеет фокус с ЗЕЛЕНЫМ, а курсор мигает. Через несколько секунд AdvBanner загружается и отображается. Когда это произойдет, редактируемый EditText потерял фокус.. с этого момента моя жизнь будет как кошмар.
Посмотрите шаг за шагом.
Проблема 1.
Если в ЭТОТ МОМЕНТ (когда Adv загружен и появляется), пользователь редактирует поле EditText с помощью мягкой клавиатуры, фокус теряется, на границе выделяется цвет СЕРЫЙ, и если пользователь продолжает для ввода текста нет результата - символы не печатаются (CURSOR в EditText слишком утерян).
Я ДУМАЮ, что любой пользователь будет раздражен - когда вы вводите текст, а курсор неактивен, потому что в фоновом режиме загружается какая-то команда, и она фокусируется на себе.
Чтобы решить эту проблему, в методе, когда загружен Adv (показано), я пытаюсь вернуться к фокусу вручную в EditText методом requestFocus.
public void onAdLoaded()
{
// TODO Auto-generated method stub
// add app specific code for this event here...
// called when an ad is successfully displayed on device
CountEdit1.requestFocus();
}
Да, курсор возвращается в поле EditText, и если мягкая клавиатура активна, пользователь все равно может печатать текст, но граница поля EditText остается GREY...
ПРИМЕЧАНИЕ: на самом деле я не уверен в различии между GREEN и GREY границем сфокусированного EditText. GREEN обычно используется, когда пользователь нажимает на него, и GREY, возможно, когда мы хотим запросите фокус вручную (используя requestFocus() и т.д.)
Задача 2. (В результате задачи сольватации №1).
После того, как мягкая клавиатура была закрыта, если пользователь нажимает на редактируемое поле EditText, он принимает фокус и курсор появляется внутри, но не реагирует на показ мягкой клавиатуры! Нажатие на него не отображает мягкую клавиатуру, но выглядит как поле редактирования в режиме копирования - когда пользователь может выбрать текст и вырезать/скопировать его в буфер обмена.
Моя цель проста для первого взгляда. Я просто хочу СОХРАНИТЬ курсор и сфокусироваться на редактируемое поле EditText (CountEdit1), пока отображается мягкая клавиатура, и пользователь вводит текст.
И нормальная реакция, когда пользователь нажимает EditText - как обычно, просто покажите мне мягкую клавиатуру!
Я читал все вопросы здесь, я объединил разные методы (clearFocus, requestFocusFromTouch и т.д.), просто недостаточно времени и пространства, чтобы описать все, что я пытался сделать, чтобы решить эту проблему. Основные проблемы описаны выше.
Надеюсь на помощь и решение проблемы...
Спасибо заранее.
Ответы
Ответ 1
Цель решена, обходной путь проще, чем я думал. Проблема №2 фиксируется с помощью метода onClick(). Достаточное условие появления мягкой клавиатуры, использующей методы clearFocus() и requestFocus().
CountEdit1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
CountEdit1.clearFocus();
CountEdit1.requestFocus();
}
});
Мягкая клавиатура появляется, когда пользователь нажимает на поле EditText.
Фиксированный.
Ответ 2
Работает для меня:
InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
editField.requestFocus();
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT);
Ответ 3
userInput.post(new Runnable() {
public void run() {
userIdInput.requestFocus();
}
});
Идите и расскажите, не решена ли ваша проблема.
Ответ 4
Вы должны запросить фокус после того, как представление создано в фрагменте или активности:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
CountEdit1.requestFocus();
}
Ответ 5
попробуйте следующее:
public void onAdLoaded()
{
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
CountEdit1.requestFocus();
InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT);
CountEdit1.setSelection(CountEdit1.getText().length());
}
},0);
}