Как убрать фокус с одного 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:
Надеюсь, что это поможет некоторым из вас!
Просто найдите другой вид и вместо этого сконцентрируйтесь на нем.
Я очень старался очистить фокус редактируемого текста. 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! (Просто моя обычная удача)
Так проходил официальный сайт разработчиков 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 фокус скачет несколько раз подряд, то появляется, то пропадает. Внутри других компонентов такого поведения замечено не было.
У меня не получилось решить эту проблему стандартными средствами андроид, поэтому я написал небольшой костыль, работающий как часы и решающий данную проблему.
На словах решение выглядит так:
- Проинициализировать все части компонента в конструкторе адаптера, в переопределенных методах из BaseExpandableListAdapter (таких как getGroupView , getChildView и т.п.) возвращать проинициализированные ранее части компонента
- При изменении фокуса на 200 миллисекунд отписываться от события смены фокуса, потом опять подписываться
Вот полностью работоспособный пример с двумя группами:
Примечание: в классе Adapter в функциях onGroupCollapsed и onGroupExpanded я добавил очистку полей, чтобы при следующем открытии они были пустыми и не провалидированными, этого можно и не делать, в зависимости от необходимого поведения.
Остальное должно быть понятно из названий функций. Если возникнут вопросы, отвечу на них в комментариях к ответу.
Источник