Мой макет содержит ListView
, SurfaceView
и EditText
. Когда я нажимаю на EditText
, он получает фокус и появляется экранная клавиатура. Когда я щелкаю где-нибудь за пределами EditText
, он все еще в фокусе (а не должен). Думаю, я мог бы настроить OnTouchListener
's на других представлениях в макете и вручную сбросить EditText
фокус. Но кажется слишком хакерским ...
У меня такая же ситуация и в другом макете - в виде списка с разными типами элементов, некоторые из которых имеют EditText
внутри. Они действуют так же, как я писал выше.
Задача - заставить EditText
потерять фокус, когда пользователь касается чего-то вне его.
Я видел здесь похожие вопросы, но не нашел решения ...
источник
hideSoftInputFromWindow()
Основываясь на ответе Кена, вот самое модульное решение для копирования и вставки.
XML не требуется.
Поместите его в свою Activity, и он будет применяться ко всем EditTexts, включая те, которые находятся во фрагментах внутри этого действия.
источник
MotionEvent.ACTION_DOWN
чтобыMotionEvent.ACTION_UP
на вашем коде. Кстати, отличный ответ!Для родительского представления EditText пусть следующие 3 атрибута будут « истинными »:
кликабельный , фокусируемый , focusableInTouchMode .
Если представление хочет получить фокус, оно должно удовлетворять этим трем условиям.
См. Android.view :
Надеюсь, поможет.
источник
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Просто поместите эти свойства в самый верхний родительский.
источник
Ответ Кена работает, но он хакерский. Как намекает pcans в комментарии к ответу, то же самое можно сделать с помощью dispatchTouchEvent. Это решение более чистое, так как оно позволяет избежать взлома XML с помощью прозрачного фиктивного FrameLayout. Вот как это выглядит:
источник
Для меня ниже работает -
1. Добавление
android:clickable="true"
иandroid:focusableInTouchMode="true"
кparentLayout
оEditText
тandroid.support.design.widget.TextInputLayout
2. Переопределение
dispatchTouchEvent
в классе активности иhideKeyboard()
функция вставки3. Добавление
setOnFocusChangeListener
для EditTextисточник
Вы, вероятно, уже нашли ответ на эту проблему, но я искал, как решить эту проблему, и до сих пор не могу найти именно то, что искал, поэтому я решил опубликовать его здесь.
Я сделал следующее (это очень обобщенно, цель - дать вам представление о том, как действовать, копирование и вставка всего кода не сработает O: D):
Сначала создайте EditText и любые другие представления, которые вы хотите использовать в своей программе, в одном представлении. В моем случае я использовал LinearLayout, чтобы обернуть все.
Затем в вашем коде вы должны установить Touch Listener для вашего основного LinearLayout.
Я надеюсь, что это поможет некоторым людям. Или, по крайней мере, помогает им начать решать свою проблему.
источник
Просто определите два свойства родительского элемента
EditText
как:Поэтому, когда пользователь коснется за пределами
EditText
области, фокус будет удален, потому что фокус будет перенесен в родительский вид.источник
У меня есть
ListView
множествоEditText
мнений. Сценарий гласит, что после редактирования текста в одной или нескольких строках мы должны щелкнуть по кнопке с названием «Готово». Я использовалonFocusChanged
наEditText
вид изнутри ,listView
но после нажатия на финише данные не сохраняются. Проблема решилась добавлениемвнутри
onClickListener
кнопки «Готово», и данные были успешно сохранены.источник
Я действительно думаю, что это более надежный способ использования,
getLocationOnScreen
чемgetGlobalVisibleRect
. Потому что я столкнулся с проблемой. Существует Listview, который содержит некоторый Edittext и установленныйajustpan
в действии . Я нахожуgetGlobalVisibleRect
возвращаемое значение, которое выглядит как включение в него scrollY, но event.getRawY всегда находится рядом с экраном. Приведенный ниже код работает хорошо.источник
Чтобы потерять фокус при касании другого представления, оба представления должны быть установлены как view.focusableInTouchMode (true).
Но, похоже, фокусировки в сенсорном режиме использовать не рекомендуется. Взгляните сюда: http://android-developers.blogspot.com/2008/12/touch-mode.html
источник
Лучший способ - использовать метод по умолчанию
clearFocus()
Вы умеете правильно разгадывать коды
onTouchListener
?Просто позвони
EditText.clearFocus()
. Это очистит фокус вlast EditText
.источник
Как предложил @pcans, вы можете сделать это переопределением
dispatchTouchEvent(MotionEvent event)
в своей деятельности.Здесь мы получаем координаты касания и сравниваем их с границами просмотра. Если касание выполняется вне поля зрения, сделайте что-нибудь.
Также нет необходимости проверять наличие и видимость представления, если макет вашей деятельности не изменяется во время выполнения (например, вы не добавляете фрагменты или не заменяете / не удаляете представления из макета). Но если вы хотите закрыть (или сделать что-то похожее) настраиваемое контекстное меню (например, в Google Play Store при использовании меню переполнения элемента), необходимо проверить наличие представления. В противном случае вы получите файл
NullPointerException
.источник
Этот простой фрагмент кода делает то, что вы хотите
источник
В Котлине
hidekeyboard () - это расширение Kotlin
В активность добавить dispatchTouchEvent
Добавьте эти свойства в самый верхний родительский
источник
Это моя версия, основанная на коде zMan. Клавиатура не скроется, если следующий вид также является текстом редактирования. Он также не скроет клавиатуру, если пользователь просто прокручивает экран.
источник