Как убирать фокус android

Как убрать фокус с одного editText

В моем приложении у меня есть один EditText вместе с некоторым TextViews , кнопкой и счетчиком. Мой EditText получает фокус, поскольку я считаю, что это единственное фокусируемое представление в этой деятельности. Мой EditText отображается с оранжевой рамкой и курсором в поле.

Теперь я хочу убрать фокус с этого поля (я не хочу, чтобы курсор и граница отображались). Есть ли способ сделать это?

Мне удалось сосредоточиться на кнопке, выполнив button.seFocusableInTouchMode() и button.requestFocus() . Но это выделяет кнопку, и это явно не то, что мне нужно.

17 ответов

Отметьте этот вопрос и выбранный ответ: Остановить EditText от получения фокуса при запуске Activity Это некрасиво, но работает, и, насколько я знаю, лучшего решения нет.

Новичок в android .. пробовал

Просто чтобы добавить .. ваш макет должен иметь:

Вы пробовали использовать старый добрый View.clearFocus()

Я попытаюсь объяснить, как удалить фокус (мигающий курсор) из представления EditText, с некоторыми подробностями и пониманием. Обычно эта строка кода должна работать

Но может возникнуть ситуация, когда editText все еще находится в фокусе, и это происходит из-за того, что метод clearFocus () пытается установить фокус обратно на первое фокусируемое представление в макете действия / фрагмента.

Итак, если у вас есть только одно представление в действии, на которое можно сфокусироваться, и это обычно будет ваше представление EditText, тогда clearFocus () снова установит фокус на это представление, и вам будет казаться, что clearFocus () не работает. Помните, что представления EditText по умолчанию настраиваются (true), поэтому, если у вас есть только одно представление EditText внутри вашего макета, оно всегда будет фокусироваться на экране. В этом случае ваше решение будет заключаться в том, чтобы найти родительский вид (некоторый макет, например LinearLayout, Framelayout) внутри вашего файла макета и установить для него этот xml-код

После этого, когда вы выполните editText.clearFocus (), родительский вид внутри вашего макета примет фокус, и ваш editText будет очищен от фокуса.

Надеюсь, это поможет кому-нибудь понять, как работает clearFocus ().

Если Edittext родительский макет равен Linear , тогда добавьте

Как показано ниже

Когда родительский макет Edittext является относительным, тогда

Я знаю, что уже слишком поздно, но для кого-то такая же необходимость editText.setFocusable (false) si, что вы ищете.

Используйте прилагаемый код, чтобы передать фокус «кому-то другому», это нормально, если у вас есть представление, в котором вы просто хотите закрыть клавиатуру и освободить фокус, вам все равно, кто это получит.

Используйте так: FocusHelper.releaseFocus (viewToReleaseFocusFrom)

Док. Метод переходит от дочернего представления вверх по дереву представлений и ищет первого дочернего элемента, которому следует уделить внимание.

Изменить: вы также можете использовать API для этого:

У меня была аналогичная проблема с editText, который получил фокус с момента запуска активности. эту проблему я легко исправил вот так:

Вы добавляете этот фрагмент кода в макет, содержащий editText в xml:

Не забудьте android:id , без него у меня ошибка.

Другая проблема, с которой я столкнулся с editText, заключалась в том, что после того, как он получил первый фокус, фокус никогда не исчезал. это часть моего кода на java, у него есть editText и кнопка, которая фиксирует текст в editText:

Надеюсь, что это поможет некоторым из вас!

Читайте также:  Java компоненты для android

Просто найдите другой вид и вместо этого сконцентрируйтесь на нем.

Я очень старался очистить фокус редактируемого текста. clearfocus (), focusable и другие вещи у меня никогда не работали. Поэтому мне пришла в голову идея позволить фальшивому редактируемому тексту получить фокус:

Затем в вашем java-коде:

Он скроет клавиатуру и удалит фокус любого редактируемого текста, в котором она есть. а также, как вы видите, фальшивый текст редактирования находится вне экрана и не виден

Для меня это сработало

Добавьте эти атрибуты в свой EditText

После этого в своем коде вы можете просто написать

Просто включите эту строку

В сегменте XML, соответствующем макету EditText.

Вам просто нужно убрать фокус с вида, как

Если я правильно понял ваш вопрос, это должно вам помочь:

Поскольку я был в виджете, а не в действии, я сделал:

Источник

Android: заставить EditText удалить фокус? [дубликат]

этот вопрос уже есть ответ здесь:

Я хотел бы иметь возможность удалить фокус из EditText. Например, если клавиатура появляется, и пользователь скрывает ее с помощью кнопки «назад», я хотел бы, чтобы фокус и курсор исчезли. Как можно ли это сделать?

19 ответов:

Вы можете добавить это onCreate и он будет скрывать клавиатуру каждый раз, когда начинается activty.

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

вы можете сделать курсор и фокус отпадают сами

но обнаружить, когда скрытие клавиатуры-это тяжелая работа.

добавить LinearLayout до EditText в XML.

или вы можете сделать то же самое, добавив эти строки для просмотра перед вашим «EditText».

снимите фокус, но оставайтесь фокусируемым:

EditText потеряет фокус, но может получить его снова на новом событии касания.

это работает для меня

Edit в ссылке они предлагают использовать LinearLayout, но простой вид будет работать

затем, если этот » вор » помещается в верхней части макета (чтобы быть первым фокусируемым элементом), вызывает clearFocus() будет работать.

добавьте эти два свойства в родительский макет (например: линейный макет, относительный макет)

Это будет делать трюк 🙂

вы также можете включить android: windowSoftInputMode= «stateAlwaysHidden» в разделе манифеста действий.

но в XML-способе.

FYI, вы также можете скрыть клавиатуру с кодами:

Если вы не используете его и все равно та же проблема

пользователей LinearLayout как родитель и установить

надеюсь, что это поможет вам.

попробуйте использовать это на ваш взгляд это сработало для меня:

добавить в родительский макет, где вы положили свой EditText этой android:focusableInTouchMode=»true»

чтобы скрыть клавиатуру при запуске активности.. напишите следующий код в onCreate()..

чтобы очистить фокус и удалить курсор из edittext.

Это мой самый первый ответ на SO, так что не будьте слишком суровы ко мне, если есть ошибки. : D

есть несколько ответов, плавающих вокруг так, но я чувствую желание опубликовать мое полное решение, потому что это свело меня с ума. Я схватил кусочки со всех сторон, так что простите меня, если я не даю соответствующие кредиты всем. 🙂

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

для вашего макета вам нужен родитель ваш EditText и Родительский вид определено что-то вроде этого:

Итак, мне нужно было несколько вещей здесь. Мне нужно было иметь заполнитель для моего EditText-который является то —

это произошло на EditText не быть сфокусированным на входе активность и активность сам при его установке этот параметр помогает, так что вы можете установить onTouchListener на нем, чтобы украсть фокус от EditText.

сейчас в работе:

Читайте также:  Ноутбук не могу подключиться через андроид

несколько ответов на биты, которые я нашел на этой странице вопроса, и часть с решением активности, которое я нашел на этом блог. Остальное, что я пропустил, что я должен был выяснить сам, было очищено сосредоточьтесь на EditText который я добавил к обоим внутри setOnEditorActionListener и onTouchLister для Родительский вид.

надеюсь, что это помогает кто-то и экономит их время. 🙂

в комментариях вы спросили, Можно ли сфокусировать другое представление вместо EditText. Да, может. Используйте .requestFocus() метод для представления, которое вы хотите сфокусировать в начале (в методе onCreate ())

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

вы также можете включить android:windowSoftInputMode=»stateAlwaysHidden» в разделе манифест действий.

у меня была та же проблема. Это сделало меня более чем сумасшедшим.

у меня был расширенный диалог с ScrollView, который имел TableLayout с расширенным LinearLayout, который содержал панель поиска и EditText.

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

Я пробовал почти все решения этой темы и ни один не работал для меня.

Так вот мой простое решение: (text = EditText)

кстати я не для его решения использовался любой из следующих фрагментов:

И не используется элемент распорки, как вид с шириной и высотой 1dp.

надеюсь, это поможет кому-то: D

The EditText сможет получить фокус, когда пользователь прикоснется к нему. Когда основной макет (активность, диалог и т. д.) становится видимым EditText не получает автоматически фокус, даже если это первый вид в макете.

Источник

Как очистить фокус от всех выбираемых элементов в представлении?

Моя проблема проста. Как очистить фокус всех элементов в представлении, которые могут иметь фокус ( например, EditText textIsSelectable=»true» TextView , textIsSelectable=»true» и текст, выбранный в нем при возникновении события clearFocus ).

Почему я спрашиваю (если я не получаю общий ответ выше):

У меня есть несколько фрагментов , доступ к которым можно получить через Navigation View . Моя главная цельпотерять фокус элементов в фрагменте на Ящике, открытом в режиме навигации. Я знаю, что его можно получить методом onDrawerSlide для NavigationDrawer и установить его в моей MainActivity, чтобы открывать ящик, если мой EditText в одном из фрагментов открыт, я вызываю код hideSoftKeyboard, чтобы он закрывал SoftKeyboard.

Мой код, чтобы получить событие при открытии ящика : (в методе onCreate () MainActivity)

Здесь мой код hideSoftKeyboard () является общим и может закрывать SoftKeyboard независимо от того, какой фрагмент отображается в данный момент из самой MainActivity . Аналогичным образом я хочу очистить все мои EditTexts и TextView (поскольку опция Copy / Paste появляется в середине ящика, когда она открыта).

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

(Если это возможно, может быть много последствий этого и может помочь во многих случаях)

Ну, наконец, я решил, что больше не могу ждать ответа на общий ответ, поэтому решил реализовать onDrawerSlide для каждого фрагмента . Оказывается, даже это немного сложно, так как вам нужно получить доступ к вашей панели инструментов и настроить свой ящик с помощью текущего ящика, и немного экспериментирования бросает NPE! (Просто моя обычная удача)

Читайте также:  Oukitel k10000 обновление до android 9

Так проходил официальный сайт разработчиков Android для любого понимания, когда это мелькнуло для меня. Почему бы не использовать getCurrentFocus для получения моего текущего представления, а затем clearFocus() ! И voilla, это работает. Я настолько сосредоточился на сложной ситуации, что забыл проверить простые детали.

Итак, вот ответ на мой собственный вопрос: (in onCreate for MainActivity)

Спасибо @keivan Esbati за то, что он указал на лазейку, которую я не заметил из-за моего использования фиктивного представления (используется в макете xml, так что, как только макет загружается, первый EditText не получает фокуса). На форуме разработчиков Android:

ClearFocus (): Когда View очищает фокус, структура пытается сфокусироваться на первом фокусируемом представлении сверху. Следовательно, если этот вид является первым сверху, который может сфокусироваться, тогда будут вызваны все обратные вызовы, связанные с очищающим фокусом, после чего структура будет сфокусирована на этом представлении.

Обход к этому, конечно же, заключается в настройке фиктивной переменной, которая вызывает фокус, как только загружается макет (метод, который я использовал), или это, как разделяемое @keivan.

Примечание: я приложил для этого щедрость, так как никто не смог ответить, и я сам получил ответ, задаюсь вопросом, что будет с Баунти: D

Обновление: Bounty истек, и ничего не произошло. Полагаю, это имеет смысл, если вы пойдете по теории рекламы. Но все равно.

getCurrentFocus().clearFocus() Но помните, что это просто перемещает фокус из текущего представления в первый элемент вашего представления, а не полностью удаляет фокус из представлений; Поэтому, если первым элементом в вашем макете является EditText он снова получит фокус.

Способ убедиться, что ваше представление не получает фокус снова, заключается в том, чтобы добавить эти атрибуты в корневое представление в вашем xml, позволяя корневому представлению захватить фокус:

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

Если у вас есть несколько действий, и в этих действиях только одно действие имеет вид навигации. В этом случае, если вы хотите очистить фокус на navView, используйте этот код,

Источник

Действие на потерю фокуса в `EditText`

У меня есть несколько EditText ,и мне нужно проверять на валидность когда фокус теряется.

А Валидации типа этого:

Не работает, точнее валидация срабатывает когда просто кликаешь на EditText, а мне нужно чтобы валидация срабатывала когда фокус теряется!

Вопрос: Что я пропустил?

3 ответа 3

UPD_1 (дабы не засорять ответ лишней информацией удалил все не относящееся к решению проблемы)

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

У меня не получилось решить эту проблему стандартными средствами андроид, поэтому я написал небольшой костыль, работающий как часы и решающий данную проблему.

На словах решение выглядит так:

  1. Проинициализировать все части компонента в конструкторе адаптера, в переопределенных методах из BaseExpandableListAdapter (таких как getGroupView , getChildView и т.п.) возвращать проинициализированные ранее части компонента
  2. При изменении фокуса на 200 миллисекунд отписываться от события смены фокуса, потом опять подписываться

Вот полностью работоспособный пример с двумя группами:

Примечание: в классе Adapter в функциях onGroupCollapsed и onGroupExpanded я добавил очистку полей, чтобы при следующем открытии они были пустыми и не провалидированными, этого можно и не делать, в зависимости от необходимого поведения.

Остальное должно быть понятно из названий функций. Если возникнут вопросы, отвечу на них в комментариях к ответу.

Источник

Оцените статью