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

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

Просто шучу 🙂

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

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

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

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

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

Re: # 1 выше – Не существует метода removeFocus() , или что-то похожее

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

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

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

  

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

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

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

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

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

 View current = getCurrentFocus(); if (current != null) current.clearFocus(); 
  1. Вы можете использовать View.clearFocus() .

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

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

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

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

 android:focusableInTouchMode="true" 

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

Взято у умного человека, комментирующего это: https://stackoverflow.com/a/2059394/956975

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

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

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

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

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

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

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

 android:focusableInTouchMode="true" android:focusable="true" android:clickable="true" 

Добавьте их в свою ViewGroup, которая включает в себя EditTextView. Он корректно работает с моей маской Constraint. Надеюсь, что эта помощь

  • Добавление расширяемогоListView в NavigationView
  • Сдвиньте макет снизу экрана
  • Как сделать grid-view горизонтально прокручиваемым в android
  • Ошибка раздувания fragmentа classа
  • Динамическое добавление содержимого в линейную компоновку?
  • Как установить фоновый рисунок кнопки изображения для разных состояний?
  • Редактор макета Android ConstraintLayout
  • Что означает параметр LayoutInflater attachToRoot?
  • Как вы можете определить, когда был составлен макет?
  • Почему LayoutInflater игнорирует параметры layout_width и layout_height, которые я указал?
  • разница между @id и @android: id
  • Давайте будем гением компьютера.