Подтвердить что ты не робот

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 и т.д.), просто недостаточно времени и пространства, чтобы описать все, что я пытался сделать, чтобы решить эту проблему. Основные проблемы описаны выше.

Надеюсь на помощь и решение проблемы... Спасибо заранее.

4b9b3361

Ответ 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);
}