Остановить EditText от получения фокуса при запуске Activity

У меня есть Activity в Android, с двумя элементами:

  1. EditText
  2. ListView

Когда моя Activity начинается, EditText сразу имеет фокус ввода (мигающий курсор). Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Я пытался:

 EditText.setSelected(false); 

Не повезло. Как я могу убедить EditText не выбирать себя при запуске Activity ?

Отличные ответы от Люка и Марка, однако, хороший образец кода отсутствует. Добавление тега android:focusableInTouchMode="true" в как в следующем примере, устранит проблему.

     

Является ли фактическая проблема, что вы просто не хотите, чтобы она была сосредоточена? Или вы не хотите, чтобы она отображала виртуальную клавиатуру в результате фокусировки EditText ? Я действительно не вижу проблемы с тем, что EditText сосредоточился на запуске, но определенно проблема в том, что окно softInput открывается, когда пользователь явно не запрашивает сосредоточиться на EditText (и в результате откройте клавиатуру).

Если это проблема виртуальной клавиатуры, см. Документацию элемента AndroidManifest.xml .

android:windowSoftInputMode="stateHidden" – всегда скрывать его при вводе активности.

android:windowSoftInputMode="stateUnchanged" – не меняйте его (например, не показывайте его, если он еще не показан, но если он был открыт при вводе активности, оставьте его открытым).

Существует более простое решение. Установите эти атрибуты в родительском макете:

  

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

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

 findViewById(R.id.mainLayout).requestFocus(); 

Хороший комментарий от Guillaume Perrot :

android:descendantFocusability="beforeDescendants" кажется по умолчанию (целочисленное значение равно 0). Он работает, просто добавив android:focusableInTouchMode="true" .

Действительно, мы видим, что beforeDescendants заданы по умолчанию в ViewGroup.initViewGroup() (Android 2.2.2). Но не равно 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Благодаря Гийому.

Единственное решение, которое я нашел, это:

  • Создайте LinearLayout (я не знаю, будут ли работать другие типы Layout)
  • Установите атрибуты android:focusable="true" и android:focusableInTouchMode="true"

И EditText не получит фокус после начала деятельности

Проблема, похоже, исходит из свойства, которое я могу видеть только в XML form макета.

Обязательно удалите эту строку в конце объявления в тегах XML EditText :

  

Это должно дать что-то вроде этого:

  // /* <-- without this line */  

используя информацию, предоставленную другими плакатами, я использовал следующее решение:

в макете XML

     

in onCreate ()

 private AutoCompleteTextView mAutoCompleteTextView; private LinearLayout mLinearLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylayout); //get references to UI components mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete); mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus); } 

и, наконец, in onResume ()

 @Override protected void onResume() { super.onResume(); //do not give the editbox focus automatically when activity starts mAutoCompleteTextView.clearFocus(); mLinearLayout.requestFocus(); } 

Следующее останавливает редактирование edittext при создании, но хватайте его, когда вы прикасаетесь к ним.

  

Таким образом, вы устанавливаете focusable в false в xml, но ключ находится в java, в который вы добавляете следующий прослушиватель:

 etBonus.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.setFocusable(true); v.setFocusableInTouchMode(true); return false; } }); 

Поскольку вы возвращаете false, то есть не потребляете событие, поведение фокусировки будет продолжаться, как обычно.

Попробуйте clearFocus () вместо setSelected(false) . Каждый взгляд на Android имеет как фокусность, так и возможность выбора, и я думаю, что вы хотите просто очистить фокус.

Я попробовал serval ответить индивидуально, но основное внимание по-прежнему уделяется EditText. Я могу решить его только с помощью двух из вышеперечисленного решения.

  

(Ссылка из Silver https://stackoverflow.com/a/8639921/15695 )

и удалить

   

в EditText

(Ссылка от floydaddict https://stackoverflow.com/a/9681809 )

Ни один из этих решений не работал для меня. То, как я исправляю автофокусировку, было:

     

Простое решение: в AndroidManifest в теге Activity используйте

 android:windowSoftInputMode="stateAlwaysHidden" 

Вы можете просто установить «focusable» и «focusable in touch mode» в значение true в первом TextView layout . Таким образом, когда активность начинается, TextView будет сфокусирован, но из-за своей природы вы не увидите ничего сосредоточенного на экране и, конечно же, клавиатура не будет отображаться …

Следующее работало для меня в Manifest . Написать ,

  

Мне нужно было очистить фокус от всех полей программно. Я просто добавил следующие два утверждения в мое основное определение макета.

 myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); myLayout.setFocusableInTouchMode(true); 

Вот и все. Исправлена ​​ошибка. Спасибо, Серебро, за то, что указал мне в правильном направлении.

Добавьте android:windowSoftInputMode="stateAlwaysHidden" в теге активности файла Manifest.xml .

Источник

Если у вас есть другое представление о вашей деятельности, например ListView , вы также можете:

 ListView.requestFocus(); 

в вашем onResume() чтобы захватить фокус с editText .

Я знаю, что на этот вопрос был дан ответ, но просто предоставил альтернативное решение, которое сработало для меня 🙂

Попробуйте это перед первым редактируемым полем:

  ---- findViewById(R.id.dummyfocus).setFocusableInTouchMode(true); findViewById(R.id.dummyfocus).requestFocus(); 

Добавьте в метод onCreate следующее:

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Простой ответ, просто добавьте это в родительский макет XML.

 android:focusable="true" android:focusableInTouchMode="true" 

Будучи тем, что я не люблю загрязнять XML тем, что связано с функциональностью, я создал этот метод, который «прозрачно» крадет фокус с первого фокусируемого вида, а затем, при необходимости, удаляет себя!

 public static View preventInitialFocus(final Activity activity) { final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content); final View root = content.getChildAt(0); if (root == null) return null; final View focusDummy = new View(activity); final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { view.setOnFocusChangeListener(null); content.removeView(focusDummy); } }; focusDummy.setFocusable(true); focusDummy.setFocusableInTouchMode(true); content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0)); if (root instanceof ViewGroup) { final ViewGroup _root = (ViewGroup)root; for (int i = 1, children = _root.getChildCount(); i < children; i++) { final View child = _root.getChildAt(i); if (child.isFocusable() || child.isFocusableInTouchMode()) { child.setOnFocusChangeListener(onFocusChangeListener); break; } } } else if (root.isFocusable() || root.isFocusableInTouchMode()) root.setOnFocusChangeListener(onFocusChangeListener); return focusDummy; } 

Поздно, но, возможно, полезно. Создайте фиктивный EditText в верхней части макета, затем вызовите myDummyEditText.requestFocus() в onCreate()

  

Кажется, это ведет себя так, как я ожидаю. Нет необходимости обрабатывать изменения конфигурации и т. Д. Мне это нужно для Activity с длинным TextView (инструкциями).

Да, я сделал то же самое – создаю «фиктивный» линейный макет, который получает первоначальный фокус. Кроме того, я установил «следующие» идентификаторы фокуса, чтобы пользователь не мог больше сконфигурировать его после прокрутки:

   dummy.setNextFocusDownId(et.getId()); dummy.setNextFocusUpId(et.getId()); et.setNextFocusUpId(et.getId()); 

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

благодаря

Для меня все, что работает на всех устройствах, это:

    

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

Это идеальное и самое простое решение. Я всегда использую это в своем приложении.

 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 

Напишите эту строку в макете родителя …

  android:focusableInTouchMode="true" 

Самое простое, что я сделал, это сосредоточиться на другом представлении в onCreate:

  myView.setFocusableInTouchMode(true); myView.requestFocus(); 

Это остановило мягкую клавиатуру, и в EditText не было курсора.

Запишите этот код внутри файла Manifest в разделе « Activity где вы не хотите открывать клавиатуру.

 android:windowSoftInputMode="stateHidden" 

Файл манифеста:

                

В onCreate вашей деятельности просто добавьте clearFocus() в свой элемент EditText. Например,

 edittext = (EditText) findViewById(R.id.edittext); edittext.clearFocus(); 

И если вы хотите перенаправить фокус на другой элемент, используйте requestFocus() . Например,

 button = (Button) findViewById(R.id.button); button.requestFocus(); 

Вы можете достичь этого, создав манекен EditText с шириной и высотой 0dp , установленным в 0dp , и запросите фокус на этом представлении. Добавьте следующий fragment кода в свой XML-макет:

    

Обязательно удалите строку "" из тега EditText в xml.

     
Interesting Posts
Давайте будем гением компьютера.