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 от получения фокуса при запуске Activity
У меня есть Android- Activity с двумя элементами:
Когда моя Activity начинается, в EditText сразу появляется фокус ввода (мигающий курсор). Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Я пытался:
Не повезло. Как я могу убедить EditText не выбирать себя при запуске Activity ?
Отличные ответы от Люка и Марка, однако хороший код отсутствует:
Является ли фактическая проблема, что вы просто не хотите, чтобы она была сосредоточена? Или вы не хотите, чтобы он отображал виртуальную клавиатуру в результате фокусировки EditText ? Я действительно не вижу проблемы с тем, что EditText сосредоточился на запуске, но определенно проблема заключается в том, что окно softInput открывается, когда пользователь явно не запрашивает фокусировку на EditText (и в результате открывает клавиатуру).
Если это проблема виртуальной клавиатуры, обратитесь к документации элемента AndroidManifest.xml .
android:windowSoftInputMode=»stateHidden» – всегда скрывать его при вводе активности.
android:windowSoftInputMode=»stateUnchanged» – не меняйте его (например, не показывайте его, если он еще не показан, но если он был открыт при вводе активности, оставьте его открытым).
Существует более простое решение. Установите эти атрибуты в родительском макете:
И теперь, когда активность начнется, этот основной макет по умолчанию получит фокус.
Кроме того, мы можем удалить фокус из дочерних представлений во время выполнения (например, после завершения редактирования дочерних элементов), снова обратив внимание на основной макет, например:
Хороший комментарий от Guillaume Perrot :
android:descendantFocusability=»beforeDescendants» кажется по умолчанию (целочисленное значение равно 0). Он работает, просто добавив android:focusableInTouchMode=»true» .
На самом деле мы видим, что beforeDescendants заданы по умолчанию в ViewGroup.initViewGroup() (Android 2.2.2). Но не равно 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Единственное решение, которое я нашел, это:
- Создайте LinearLayout (я не знаю, будут ли работать другие виды макетов)
- Установите атрибуты android:focusable=»true» и android:focusableInTouchMode=»true»
И EditText не получит фокус после начала деятельности
Проблема, похоже, исходит из свойства, которое я могу видеть только в XML-форме макета.
Обязательно удалите эту строку в конце объявления EditText:
Это должно дать что-то вроде этого:
Используя информацию, предоставленную другими плакатами, я использовал следующее решение:
В макете XML
In onCreate ()
И, наконец, in onResume ()
Следующее останавливает редактирование edittext при создании, но хватайте его, когда вы прикасаетесь к ним.
Таким образом, вы устанавливаете focusable в false в xml, но ключ находится в java, в который вы добавляете следующий прослушиватель:
Поскольку вы возвращаете false, то есть не потребляете событие, поведение фокусировки будет продолжаться, как обычно.
Попробуйте clearFocus () вместо setSelected (false). Каждый вид в Android имеет как возможность фокусировки, так и возможность выбора, и я думаю, что вы хотите просто очистить фокус.
Я попробовал serval ответить индивидуально, но основное внимание все еще находится в EditText. Я могу решить его только с помощью двух из вышеизложенного решения.
Ни один из этих решений не работал для меня. Как я исправил автофокус:
Простое решение: в AndroidManifest в теге Activity используйте
Вы можете просто установить «focusable» и «focusable in touch mode» для значения true в первом TextView layout . Таким образом, когда активность начнется, TextView будет сфокусирован, но из-за своей природы вы не увидите ничего сосредоточенного на экране и, конечно же, клавиатура не будет отображаться …
Следующее работало для меня в Manifest . Написать ,
Мне нужно было очистить фокус от всех полей программно. Я просто добавил следующие два утверждения в мое основное определение макета.
Вот и все. Исправлена ошибка. Спасибо, Серебро, за то, что указал мне в правильном направлении.
Добавить android:windowSoftInputMode=»stateAlwaysHidden» в теге активности файла Manifest.xml .
Попробуйте это перед первым редактируемым полем:
Если у вас есть другое представление о вашей деятельности, например ListView , вы также можете:
В вашем onResume() чтобы захватить фокус с editText .
Я знаю, что на этот вопрос был дан ответ, но просто предоставил альтернативное решение, которое сработало для меня 🙂
Добавьте в метод onCreate следующее:
Поскольку я не люблю загрязнять XML тем, что связано с функциональностью, я создал этот метод, который «прозрачно» убирает фокус с первого фокусируемого вида, а затем, при необходимости, удаляет себя!
Поздно, но, возможно, полезно. Создайте фиктивный EditText в верхней части вашего макета, затем вызовите myDummyEditText.requestFocus() в onCreate()
Кажется, это ведет себя так, как я ожидаю. Нет необходимости обрабатывать изменения конфигурации и т. Д. Мне это нужно для Activity с длинным TextView (инструкциями).
Да, я сделал то же самое – создаю «фиктивный» линейный макет, который получает первоначальный фокус. Кроме того, я установил «следующие» идентификаторы фокуса, чтобы пользователь не мог больше фокусировать его после прокрутки:
Много работы только для того, чтобы избавиться от фокуса на взгляд ..
Самое простое, что я сделал, это сосредоточиться на другом представлении в onCreate:
Это остановило мягкую клавиатуру, и в EditText не было курсора.
Для меня то, что работало на всех устройствах, таково:
Просто поставьте это как представление перед проблематичным сфокусированным взглядом, и все.
Это идеальное и самое простое решение. Я всегда использую это в своем приложении.
В onCreate вашей деятельности просто добавьте clearFocus() в свой элемент EditText. Например,
И если вы хотите перенаправить фокус на другой элемент, используйте requestFocus() . Например,
Вы можете добиться этого, создав манекен EditText с шириной и высотой 0dp , установленным в 0dp , и запросите фокус на этом представлении. Добавьте следующий фрагмент кода в свой XML-макет:
Я использую следующий код, чтобы остановить EditText от кражи фокуса при нажатии кнопки.
В основном, скройте текст редактирования, а затем снова покажите его. Это работает для меня, поскольку EditText не отображается, поэтому не имеет значения, отображается ли оно.
Вы можете попытаться скрыть и показать его подряд, чтобы убедиться, что это помогает ему потерять фокус.
Обязательно удалите строку » » из тега EditText в xml.
Источник
Как удалить фокус из одного 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 с ее помощью. А также, поскольку вы видите, что поддельный редактор выходит из экрана и не может быть замечен
Источник