- EditText, очистить фокус при касании снаружи
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- android edittext удалить Фокус после нажатия кнопки
- 8 ответов
- Как удалить фокус из одного editText
- Android edittext удаляет фокус после нажатия кнопки
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Как очистить фокус от всех выбираемых элементов в представлении?
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
Источник
android edittext удалить Фокус после нажатия кнопки
У меня есть действие с EditText и кнопкой. Когда пользователь нажимает на EditText, отображается клавиатура, и он может ввести текст — отлично. Но когда пользователь нажимает на кнопку, Я хочу, чтобы EditText больше не был в фокусе, т. е. клавиатура скрывается, пока пользователь снова не нажмет на EditText.
что я могу сделать, чтобы «скрыть фокус» EditText после нажатия кнопки. Некоторый код я могу добавить в метод OnClick кнопки, чтобы сделать это?
С Наилучшими Пожеланиями
8 ответов
поместите это в прослушиватель кнопок:
редактировать
решение выше сломает ваше приложение, если нет EditText ориентирован на. Измените свой код следующим образом:
добавить этот метод в класс:
затем в прослушивателе кнопок вызовите метод следующим образом:
создать поддельный вид, чтобы получить фокус, когда вы пытаетесь clearFocus в своем edittext :
обратите внимание, что этот вид не требует места в макете, поэтому он не имеет значения с вашим макетом.
в классе управления, называют это:
о клавиатуре, скрыть клавиатуру после edtThief имеет фокус.
Я успешно использовал следующее в коде кнопки onClick:
несколько менее сложные, чем другие методы.
самое элегантное решение, которое я мог найти, это:
вы можете сохранить этот метод в служебный класс:
просто вызвав метод hideSoftKeyboad (), он скроет клавиатуру, но, как вы можете видеть, фокус все равно будет присутствовать.
для того, чтобы удалить фокус мы будем использовать простой трюк. Прямо над элементами управления вводом добавьте фиктивный вид, например:
затем написать эту строку кода в том месте, где вы называете метод скрытия фокуса:
поскольку приложение должно передать фокус на следующий элемент управления, он будет передан нашему невидимому виду.
Источник
Как удалить фокус из одного editText
Возможный дубликат:
Остановить EditText от получения фокуса при запуске Activity?
В моем приложении у меня есть один EditText вместе с некоторыми TextViews, кнопкой и spinner. Я считаю, что мой EditText получает фокус, так как он является единственным сосредоточенным видом в этой деятельности. Мой EditText показывает оранжевую рамку и курсор на поле.
Теперь я хотел бы удалить фокус из этого поля (я не хочу, чтобы курсор и граница отображались). Есть ли способ сделать это?
Я смог сфокусироваться на кнопке, выполнив button.seFocusableInTouchMode () и button.requestFocus (). Но это подчеркивает кнопку и, очевидно, не то, что я хочу.
Проверьте этот вопрос и выбранный ответ: Остановите EditText от получения фокуса при запуске Activity. Это уродливо, но он работает, и насколько я знаю, лучшего решения нет.
Вы пытались использовать старый хороший View.clearFocus()
Новый для android .. попробовал
Это работает для меня .. любезно поправьте меня, если что-то не так 🙂
Просто добавить .. у вас макет должен иметь:
Используйте прилагаемый код, чтобы уделить внимание «кому-то другому», это нормально, если у вас есть представление, в котором вы просто хотите убрать клавиатуру и освободить фокус, вам все равно, кто ее получит.
Используйте вот так: FocusHelper.releaseFocus (viewToReleaseFocusFrom)
Doc: Метод перемещается из дочернего представления и вверх по дереву представления и ищет первого ребенка, на который нужно сосредоточиться.
Изменить: вы также можете использовать API для этого:
Я знаю, что слишком поздно, но для кого-то есть такая же потребность editText.setFocusable (false) si, что вы ищете.
У меня была аналогичная проблема с editText, которая сфокусировалась с момента начала работы. Эта проблема я легко фиксировал следующим образом:
Вы добавляете этот фрагмент кода в макет, который содержит editText в xml:
Не забудьте android:id , без него у меня есть ошибка.
Другая проблема, с которой я столкнулся с editText, заключается в том, что, когда он получает первый фокус, фокус никогда не исчезает. Это часть моего кода в java, у него есть editText и кнопка, которая захватывает текст в editText:
Надеюсь, что это поможет некоторым из вас!
Просто найдите другой взгляд и сосредоточьте его внимание.
Просто включите эту строку
В сегменте XML, соответствующем макету EditText.
Вам просто нужно очистить фокус от представления, поскольку
Если я правильно понял ваш вопрос, это должно помочь вам:
Поскольку я был в виджетах, а не в активности, которую я сделал:
Я попытаюсь объяснить, как удалить фокус (мигающий курсор) из вида EditText с некоторыми подробностями и пониманием. Обычно эта строка кода должна работать
Но это может быть ситуация, когда у editText все еще есть фокус, и это происходит потому, что метод clearFocus () пытается вернуть фокус в первый фокусный вид в макете деятельности / фрагмента.
Поэтому, если у вас есть только один вид в активности, который является настраиваемым, и это обычно будет вашим видом EditText, тогда clearFocus () снова переключит фокус на это представление, и для вас это будет выглядеть так, что clearFocus () не работает. Помните, что представления EditText являются настраиваемыми (true) по умолчанию, поэтому, если у вас есть только один вид EditText внутри вашего макета, он всегда будет фокусироваться на экране. В этом случае ваше решение будет состоять в том, чтобы найти родительский вид (некоторый макет, ex LinearLayout, Framelayout) внутри вашего файла макета и установить для него этот xml-код
После этого, когда вы выполняете editText.clearFocus (), родительский вид внутри вашего макета будет принимать фокус, и ваш editText будет свободен от фокуса.
Надеюсь, это поможет кому-то понять, как работает clearFocus ().
Я очень старался очистить фокус от текста редактирования. Clearfocus () и фокусируемая, и другие вещи никогда не работали для меня. Таким образом, я придумал идею о подделке фокуса:
Затем в вашем java-коде:
Он скроет клавиатуру и удалит фокус любого edittext с ее помощью. А также, поскольку вы видите, что поддельный редактор выходит из экрана и не может быть замечен
Источник
Android edittext удаляет фокус после нажатия кнопки
У меня есть Activity с EditText и Button. Когда пользователь нажимает на EditText, отображается клавиатура, и он может вводить текст Text — fine. Но когда пользователь нажимает кнопку «Я», я хочу, чтобы EditText больше не был в фокусе, т.е. Клавиатура скрывается, пока пользователь не нажмет на EditText.
Что я могу сделать, чтобы «скрыть фокус» EditText, после нажатия кнопки. Некоторый код, который я могу добавить в метод OnClick кнопки для этого?
С наилучшими пожеланиями
ОТВЕТЫ
Ответ 1
Поместите это в свой прослушиватель кнопок:
EDIT
Решение, описанное выше, сломает ваше приложение, если не сосредоточено EditText . Измените свой код следующим образом:
добавьте этот метод в класс:
Затем в своем прослушивателе кнопок вызовите метод следующим образом:
Ответ 2
Я успешно использовал следующее в коде кнопки onClick:
Несколько менее сложно, чем другие методы.
Ответ 3
Одним из обходных путей является создание фальшивого представления для переноса фокуса при clearFocus в edittext :
Обратите внимание, что этот вид невидим, поэтому он не требует места в макете.
В классе элемента управления вы можете добавить метод, подобный следующему, чтобы инициировать эту передачу фокуса:
Затем вы можете свернуть клавиатуру, как только у edtThief будет фокус:
Ответ 4
Самое элегантное решение, которое я могу найти, это:
Вы можете сохранить этот метод в своем классе:
Просто вызов метод hideSoftKeyboad(), он скроет клавиатуру, но, как вы можете видеть, фокус все равно будет присутствовать.
Чтобы удалить фокус, мы будем использовать простой трюк. Прямо над элементами управления вводами добавьте фиктивный вид:
Затем напишите эту строку кода в том месте, где вы вызываете метод сглаживания фокуса:
Поскольку приложение должно передать фокус на следующий элемент управления, он будет передан нашему невидимому виду.
Ответ 5
EDIT:
Ответ 6
Ответ 7
Извините поздно, но я надеюсь, что это будет правильный ответ, поскольку я исправил его с помощью
Назовите следующий фрагмент нажатием кнопки.
Ответ 8
Как я это решил.
Я надеюсь, что это поможет вам 🙂
Ответ 9
Почему бы просто отключить EditText в коде Button? Это должно избавиться от клавиатуры и фокуса.
Источник
Как очистить фокус от всех выбираемых элементов в представлении?
Моя проблема проста. Как очистить фокус всех элементов в представлении, которые могут иметь фокус ( например, 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, используйте этот код,
Источник