Clear all focus android

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

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

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

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

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

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

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

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

3 ответа

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

Моя проблема проста. Как очистить фокус всех элементов в представлении, которые могут иметь фокус ( например, 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, используйте этот код,

Источник

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, очистить фокус при касании снаружи

Мой макет содержит ListView , SurfaceView и EditText . Когда я нажимаю на EditText , он получает фокус, и появляется экранная клавиатура. Когда я нажимаю где-то за пределами EditText , он все еще имеет фокус (он не должен). Думаю, я мог бы настроить OnTouchListener на другие представления в макете и вручную очистить фокус EditText . Но кажется слишком хакерским.

У меня также такая же ситуация в другом представлении макета — списка с разными типами элементов, некоторые из которых имеют EditText внутри. Они действуют так же, как я писал выше.

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

Я видел похожие вопросы здесь, но не нашел никакого решения.

ОТВЕТЫ

Ответ 1

Я пробовал все эти решения. edc598 был самым близким к работе, но события касания не срабатывали на другом View , содержащемся в макете. Если кому-то нужно это поведение, это то, что я закончил:

Я создал (невидимый) FrameLayout , называемый touchInterceptor, как последний View в макете, чтобы он накладывал все (edit:), а также использовать RelativeLayout в качестве родительского макет и атрибуты touchInterceptor fill_parent ). Затем я использовал его для перехвата касаний и определения, было ли касание поверх EditText или нет:

Возвратите false, чтобы обработать сенсорную обработку.

Это взломало, но это единственное, что сработало для меня.

Ответ 2

Создание ответа от Ken, здесь самое модульное решение для копирования и вставки.

Не требуется XML.

Поместите его в свою активность, и он применим ко всем файлам EditTexts, в том числе к фрагментам внутри этого действия.

Ответ 3

Для родительского представления EditText допустим следующие 3 атрибута: true:
clickable, фокусируемая, focusableInTouchMode.

Если представление хочет получить фокус, оно должно удовлетворять этим 3 условиям.

См. android.view:

Надеюсь, это поможет.

Ответ 4

Кен отвечает, но он взломан. Как отмечают pcans в ответе на ответ, то же самое можно сделать с dispatchTouchEvent. Это решение является более чистым, поскольку оно позволяет избежать взлома XML с помощью прозрачного, фиктивного FrameLayout. Вот что это выглядит:

Ответ 5

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

Я сделал следующее (это очень обобщенно, цель — дать вам представление о том, как действовать, копировать и вставлять весь код не будет работать O: D):

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

Затем в вашем коде вы должны установить Touch Listener на свой основной LinearLayout.

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

Ответ 6

Я действительно считаю это более надежным способом использования getLocationOnScreen , чем getGlobalVisibleRect . Потому что я встречаюсь с проблемой. Существует Listview, в котором содержатся некоторые Edittext и set ajustpan в действии. Я нахожу getGlobalVisibleRect возвращающее значение, которое выглядит как включающее в себя scrollY, но event.getRawY всегда находится на экране. Код ниже работает хорошо.

Ответ 7

Просто поместите эти свойства в самый верхний родительский.

Ответ 8

Чтобы потерять фокус при касании другого вида, оба представления должны быть установлены как view.focusableInTouchMode(true).

Но кажется, что использование фокусов в сенсорном режиме не рекомендуется. Пожалуйста, смотрите здесь: http://android-developers.blogspot.com/2008/12/touch-mode.html

Ответ 9

У меня есть ListView , состоящий из представлений EditText . В сценарии говорится, что после редактирования текста в одной или нескольких строках мы должны нажать кнопку «закончить». Я использовал onFocusChanged в представлении EditText внутри ListView , но после нажатия на завершение данные не сохраняются. Проблема была решена путем добавления

внутри onClickListener для кнопки «закончить», и данные были успешно сохранены.

Ответ 10

Лучший способ — использовать метод по умолчанию clearFocus()

Вы знаете, как правильно решать коды в onTouchListener ?

Просто позвоните EditText.clearFocus() . Он очистит фокус в last EditText .

Ответ 11

Как показано в @pcans, вы можете сделать это переопределением dispatchTouchEvent(MotionEvent event) в своей деятельности.

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

Также нет необходимости проверять наличие и видимость представления, если макет вашей деятельности не изменяется во время выполнения (например, вы не добавляете фрагменты или не заменяете/не удаляете представления из макета). Но если вы хотите закрыть (или сделать что-то похожее) настраиваемое контекстное меню (например, в Google Play Store при использовании меню переполнения элемента), необходимо проверить соответствие действительности. В противном случае вы получите NullPointerException .

Ответ 12

Просто определите два свойства родительского элемента EditText как:

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

Ответ 13

Для меня Ниже работало —

1. Добавление android:clickable=»true» и android:focusableInTouchMode=»true» в parentLayout of EditText i.e android.support.design.widget.TextInputLayout

2. Переопределение dispatchTouchEvent в классе Activity и вставка функции hideKeyboard()

3. Добавление setOnFocusChangeListener для EditText

Источник

Читайте также:  Бесконечное лето долго запускается андроид
Оцените статью