Как восстановить фокус на редактируемом тексте при повторной загрузке расширяемого списка ...? - PullRequest
0 голосов
/ 21 октября 2011

У меня есть ExpandableListView, в котором я загружаю пользовательские макеты как в групповых, так и в дочерних видах.

У них есть текстовые поля для редактирования.

Когда я нажимаю на текст для редактирования, появляется программная клавиатура, в этот раз список перезагружается, но фокус не будет на тексте для редактирования.

В результате вводимый мной текст не вводится в этот текст редактирования.

Если я снова нажму на текст редактирования, я смогу ввести значения.

Но я хочу вернуть себе фокус даже после перезагрузки представления списка.

Я пытался сохранить последний нажатый вид и сохранить его во временной переменной, requestFocus() при перезагрузке, но он не работает.

Как этого добиться ..?

Вот снимок экрана.

image

Если у кого-нибудь есть идея, пожалуйста, помогите мне ..!

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 29 октября 2011

Я пытался сохранить последний нажатый вид и сохранить его во временном режиме. переменная requestFocus () при перезагрузке, но она не работает.

Что не работает? Ваша деятельность воссоздается, поэтому временная переменная теряется? Если это так, то этот ответ может вам помочь.

Я раньше не использовал ExpandableListView, но мне пришлось решить аналогичную проблему в моем коде. Когда происходит изменение ориентации, действие уничтожается, а затем воссоздается, поэтому я использую onRetainNonConfigurationInstance() для хранения информации, которую я хочу сохранить.

Вот пример кода:

  protected StoredState mStoredState;

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    final Object data = getLastNonConfigurationInstance();

    if (data == null)
    {
      // First time initialization
      mStoredState = new StoredState();
    }
    else
    {
      // StoredState data exists
      mStoredState = (StoredState)data;

      if (mStoredState.mFieldToGiveFocusTo != -1)
      {
        // Give focus to the field that had focus before the
        // activity was recreated
        View viewToFocus = findViewById(mStoredState.mFieldToGiveFocusTo);
        viewToFocus.requestFocus();
      }
    }
  }

  @Override
  public Object onRetainNonConfigurationInstance()
  {
    return mStoredState;
  }

  /**
   * Class to store the information about this activity when the orientation
   * is changed
   */
  private static class StoredState
  {
    int mFieldToGiveFocusTo;

    private StoredState()
    {
      mFieldToGiveFocusTo = -1;
    }
  }

Тогда вам просто нужно установить mStoredState.mFieldToGiveFocusTo, когда пользователь впервые коснется EditText.

1 голос
/ 31 октября 2011

У меня были похожие проблемы с вызовом requestFocus() внутри onCreate() или onResume(). Я смог решить эту проблему, установив фокус с небольшой задержкой. Нечто подобное может работать для вас:

new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                viewToFocus.requestFocus();

            }
        }, 100);

Я думаю, корень проблемы может заключаться в том, что AndroidFramework устанавливает фокус после обработки onResume (). Вот почему задержка может помочь.

0 голосов
/ 31 октября 2011

Управление клавиатурой SoftInput для вашей деятельности.

Взгляните на android: windowSoftInputMode

0 голосов
/ 27 октября 2011

После того, как listView развернут, вы получаете усиленный фокус на editText, добавив эту строку,

editText.requestFocus ();

0 голосов
/ 25 октября 2011

Я думаю, вы найдете ответ здесь: ExpandableListView дочерние элементы не получают фокус при прикосновении

У этого парня проблема, которая звучит так же, как ваша.

...