Как удалить фокус, не устанавливая фокус на другой элемент управления?
Мне нравятся мои интуитивные интерфейсы; каждый экран должен естественным образом и ненавязчиво направлять пользователя на следующий шаг в приложении. Если я не согласен с этим, я стараюсь сделать вещи такими же запутанными и запутанными, насколько это возможно.
Просто шучу: -)
У меня есть три 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
Ответ 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);