Как удалить фокус, не устанавливая фокус на другой элемент управления?

Мне нравятся мои интуитивные интерфейсы; каждый экран должен естественным образом и ненавязчиво направлять пользователя на следующий шаг в приложении. Если я не согласен с этим, я стараюсь сделать вещи такими же запутанными и запутанными, насколько это возможно.

Просто шучу: -)

У меня есть три TableRows, каждый из которых содержит только элемент управления EditText для чтения и без фокусировки, а затем кнопку справа. Каждая кнопка запускает ту же самую активность, но с другим аргументом. Пользователь делает выбор там, и суб-активность завершается, заполняя соответствующий EditText с выбором пользователя.

Это классический механизм каскадных значений; каждый выбор сужает доступные параметры для следующего выбора и т.д. Таким образом, я отключу оба элемента управления в каждой из следующих строк, пока EditText в текущей строке не будет содержать значение.

Мне нужно сделать одну из двух вещей в этом порядке:

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

Проблема проявляется после возвращения суб-активности; нажатая кнопка сохраняет фокус.

Re: # 1 выше - Не существует метода removeFocus() или чего-то подобного

Re: # 2 выше - я могу использовать requestFocus(), чтобы установить фокус на кнопку в следующей строке, и это работает после возвращения суб-активности, но по какой-то причине оно не работает в родительской активности onCreate().

Мне нужно согласованность пользовательского интерфейса в любом направлении - либо никакие кнопки не имеют фокуса после завершения суб-активности, либо каждая кнопка получает фокус в зависимости от своего места в логическом потоке, включая самую первую (и только) активную кнопку до любого выбор.

Ответ 1

Использование clearFocus(), похоже, не работало для меня так, как вы нашли (увидели в комментариях к другому ответу), но то, что сработало для меня в конце, добавляло:

<LinearLayout 
    android:id="@+id/my_layout" 
    android:focusable="true" 
    android:focusableInTouchMode="true" ...>

для моего самого верхнего плана Layout View (линейный макет). Чтобы удалить фокус со всех кнопок /EditTexts и т.д., Вы можете просто сделать

LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();

Запрос фокуса ничего не делал, если я не настроил представление в качестве фокуса.

Ответ 2

Старый вопрос, но я наткнулся на него, когда у меня была подобная проблема, и подумал, что я поделюсь тем, что я закончил.

Взгляд, который получил фокус, был разным каждый раз, поэтому я использовал очень общий:

View current = getCurrentFocus();
if (current != null) current.clearFocus();

Ответ 3

  • Вы можете использовать View.clearFocus().

  • Используйте View.requestFocus(), вызванный из onResume().

Ответ 4

Как насчет добавления android:windowSoftInputMode="stateHidden" в вашу активность в манифесте.

Взято от умного человека, комментирующего это: fooobar.com/questions/254/...

Ответ 5

Прежде всего, он будет работать на 100%........

  • Создайте метод onResume().
  • Внутри этого onResume() найдите представление, которое фокусируется снова и снова на findViewById().
  • Внутри этого onResume() установите requestFocus() в это представление.
  • Внутри этого onResume() установите clearFocus в это представление.
  • Перейдите в xml того же макета и найдите этот вид сверху, который вы хотите сфокусировать, и установите focusable true и focusableInTuch true.
  • Внутри этого onResume() найдите приведенный выше вид сверху findViewById
  • Внутри этого onResume() установите requestFocus() на это представление в последний раз.
  • И теперь наслаждайтесь......

Ответ 6

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/ll_root_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();

Я использую это, когда уже закончена информация профиля обновления и удаляет все фокус из EditText в моем макете

==== > Обновление: в содержимом родительского макета моя строка добавления EditText:

android:focusableInTouchMode="true"

Ответ 7

Вы могли бы попытаться отключить основную активность активности, чтобы сохранить ее состояние (таким образом, заставив его забыть, какой элемент управления имел текст и что имело фокус). Вам понадобится другой способ запомнить, что у вашего EditText есть, и повторить их onResume(). Запустите свои суб-действия с помощью startActivityForResult() и создайте обработчик onActivityResult() в своей основной деятельности, который правильно обновит EditText. Таким образом, вы можете установить нужную кнопку, которую хотите сфокусировать на Resume(), в то же время, когда вы повторно заселяете EditText с помощью myButton.post(новый Runnable() {run() {myButton.requestFocus();}});

Метод View.post() полезен для настройки фокуса изначально, потому что эта runnable будет выполняться после создания окна, и все оседает, позволяя механизму фокусировки нормально функционировать к тому времени. Попытка установить фокус во время onCreate/Start/Resume() обычно имеет проблемы, я нашел.

Обратите внимание, что это псевдокод и не проверенный, но это возможное направление, которое вы могли бы попробовать.

Ответ 8

Я попытался отключить и включить фокусировку для просмотра, и это сработало для меня (фокус был reset):

focusedView.setFocusable(false);
focusedView.setFocusableInTouchMode(false);
focusedView.setFocusable(true);
focusedView.setFocusableInTouchMode(true);