Питання Зупиніть EditText, щоб отримати фокус при запуску активності


У мене є Activity в Android, з двома елементами:

  1. EditText 
  2. ListView

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

EditText.setSelected(false);

Не вдалося. Як я можу це переконати? EditText щоб не вибрати себе, коли Activity починається?


2390
2017-10-12 15:03


походження


Перш ніж користуватися будь-якою з наведених вище підказок, перевірте, чи немає у вас його <requestFocus /> рядок у вашій макеті XML (докладніше в @ floydaddict's answer) Редактор WYSIWYG Eclipse додає його автоматично. Після видалення цього рядка ця проблема зникне для мене. - DzinX
видалення просто <requestFocus /> не працював на Asus Nexus 7 з KitKat 4.4.4, але відповів Джо - user13267
Я просто використовую android: focusableInTouchMode = "true" на моїй батьківській макеті і працює для мене. - Herman
Єдиним, що працював для мене, було рішення rallat - vivoconunxino
@Herman спасибі !! ваше просте рішення працювало для мене - Adiyat Mubarak


Відповіді:


Відмінний відповідь від Люка та Марка однак відсутня хороша вибірка коду. Додавання тегу android:focusableInTouchMode="true" до <LinearLayout> подібний приклад вирішить проблему.

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>

2032
2017-11-02 15:49



Що стосується встановлення батько макет до android:focusableInTouchMode="true"! - Muhammad Babar
Чудово! Спасибі ... Одна річ, яку слід відзначити, полягає в тому, що фіктивний елемент повинен бути розміщений прямо перед фокусуючим елементом !!! Я мав TextView між моїм манекеном та EditText і метод не працював! - maddob
налаштування android: focusableInTouchMode = "true" для батьківського макета був хорошим підходом завдяки @Muhammad Babar - sujith s
хтось може пояснити, чому це працює? - Pietro Rea
@PietroRea Android має дратує поведінку автофокусування, яка вбудована в основну поведінку своєї структури додатків. Якщо ви скажете, що текст редагування знімає або втрачає фокус, він автоматично приймає рішення про те, куди спрямовується фокус. Без нового об'єкта для фокусування для перенесення, він вибирає перший фокусуючий елемент у макеті, навіть якщо цей елемент є тим, який тільки очистив його фокус! Це гайки і розчарування, але, можливо, є вагомі підстави для такого типу поведінки. - Weston Wedding


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

Якщо це проблема віртуальної клавіатури, див AndroidManifest.xml  <action> елемент документація

android:windowSoftInputMode="stateHidden" - завжди приховувати його при вступі в активність.

або android:windowSoftInputMode="stateUnchanged" - не змінюйте його (наприклад, ні показати це, якщо воно ще не показано, але якщо воно було відкрите при введенні в активність, залиште його відкритим).


1567
2018-04-09 21:22



все-таки курсор знаходиться в першому EditText в макеті - хоча клавіатура не відображається - martyglaubitz
@ Аnderson: Нічого про відповідь мали на увазі, що це буде запобігти EditText від отримання фокусу. Насправді чітко сказано, що саме так ви запобігаєте цьому програмна клавіатура IME від автоматичного відкриття фокусу; тому що більш імовірно, що більша проблема полягає в тому, що м'яка клавіатура несподівано з'являється, ні сам фокус. Якщо ваша проблема пов'язана з EditText Насправді фокус взагалі, а потім використовувати чужу відповідь. - Joe
встановити його програмно: stackoverflow.com/questions/6138330/... - Nick Franceschina
Не робіть це на активності з камерою - це порушує часовість спалаху (не питайте, чому) - Daniel Wilson
Однією з причин, щоб не робити фокус при запуску, є те, що якщо зміни відбудуться після у фокусі та на клавіатурі показано, imeOptions будуть ті, які були встановлені до зміни. - n_b


Простіший варіант існує. Встановіть ці атрибути у вашому батьківському макеті:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

І тепер, коли активність починається, цей основний макет стає фокус за замовчуванням.

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

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

Хороший коментар від Гійом Перро:

android:descendantFocusability="beforeDescendants" здається бути   за замовчуванням (ціле число - 0). Це працює просто шляхом додавання    android:focusableInTouchMode="true".

Дійсно, ми бачимо, що beforeDescendants встановити за замовчуванням в ViewGroup.initViewGroup() Метод (Android 2.2.2). Але не дорівнює 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Спасибі Гийому.


1014
2017-12-26 23:35



Важливо встановити ці атрибути до прямий батько думки, який зосереджується на створенні діяльності, інакше він не буде працювати. - tomrozb
Зверніть увагу, що це, здається, не працює, якщо батько є ScrollView - Daniel Wilson
Просто ідеальне рішення. Працює як для: 1.Розмикання автофокусування, так і 2. Відключення автоматичного відкривання м'якої клавіатури - Meet
Приємно Не обов'язково бути безпосереднім батьком. Я встановив його в кореневому рівні макета, і, здається, все нормально. - Kurotsuki
@DanielWilson, коли ви хочете, щоб прокручування виглядало як безпосередній батьківський редактор тексту? - Mark Buikema


Єдине рішення, яке я знайшов:

  • Створити LinearLayout (Я не знаю, чи працюватимуть інші види макета)
  • Встановити атрибути android:focusable="true" і android:focusableInTouchMode="true"

І це EditText не стане фокус після початку активності


386
2017-10-23 08:12



Простий !! Я спочатку додавав ці властивості до батьківського виду, який не вдалося, тоді я встановив їх у інший макет і працював нормально. Дякую!! - Rino
Він також працює з RelativeLayout. - Brian Reinhold


Здається, проблема пов'язана з властивістю, яку я бачу лише в XML form макета.

Обов'язково видаліть цю лінію в кінці декларації в межах EditText Теги XML:

<requestFocus />

Це має дати щось подібне:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

67
2018-03-13 09:57





використовуючи інформацію, надану іншими плакатами, я використав таке рішення:

в макеті XML

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

в 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);
}

і, нарешті, в onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}

63
2018-05-26 21:07





Наступне призведе до припинення редагування тексту з фокусування, коли його буде створено, але зачепіть його, доторкнувшись до них.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Таким чином, ви встановлюєте фокус в false в xml, але ключ знаходиться в java, до якого ви додаєте наступного слухача:

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

Оскільки ви повертаєте помилкові дані, тобто не використовуєте подію, поведінка фокусування буде діяти як нормально.


58
2018-06-15 04:45



Але це ніколи не отримає фокусу в майбутньому, як просто зупинитися лише на початковому (запуску діяльності) ?? - Jayesh
OnTouchListener викликається до інших дій дотику. Таким чином, за допомогою фокусування на сенсорному екрані стандартний фокус відбувається на першому торці. Клавіатура підійде і все. - MinceMan
Я думаю, що це найкращий спосіб зробити це. Також, мабумо-макс-макс-код магічного манекена вище не працює для складного набору текстів редагування ... Якщо це працює, я буду визначати, що голосуватимуть. - Radu
Але якщо у вас є кілька текстів для редагування, він зосередиться на наступному редагуванні тексту та відкриє клавіатуру, тому його краще додати android: windowSoftInputMode = "stateAlwaysHidden" у маніфесті для певної діяльності. - Karan sharma
Примітка. У Android P система більше не захопить фокус за умовчанням. Це означає, що цей рубати не потрібно починаючи з П. - MinceMan


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


54
2017-10-12 19:02



Це звучить багатообіцяюче, але в який момент в життєвому циклі діяльності слід його назвати? Якщо я називаю це на onCreate (), EditText все ще має фокус. Чи слід його викликати в onResume () або в іншому місці? Дякую! - Mark
Я поєднав прийняту відповідь з цією відповіддю. я дзвонив myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); в onResume діяльності. Це гарантувало, що EditText не зберігає фокус при повороті телефону. - teedyay


Я намагався відповісти на серванти індивідуально, але фокус залишається в EditText. Мені все-таки вдається вирішити це, використовуючи два вищезазначених рішення разом.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(Довідник з срібла https://stackoverflow.com/a/8639921/15695 )

і видалити

 <requestFocus />

в EditText

(Довідка з floydaddict https://stackoverflow.com/a/9681809 )


43
2017-11-28 10:32



Я повинен був додати edittext.clearFocus () додатково до вищесказаного, щоб він працював :) - Nav


Ніхто з цих рішень не працював для мене. Спосіб виправлення автофокусування:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

37
2017-11-30 16:37



Android: windowSoftInputMode = "adjustPan" на будь-якій активності в Маніфесті Android - rallat
не впевнений, як ти зрозумів це, але кудос брат! Це працює - portfoliobuilder


Просте рішення: В AndroidManifest в Activity використовувати тег

android:windowSoftInputMode="stateAlwaysHidden"

31
2018-03-17 15:42



Строго кажучи, це не вирішує проблему. О.П. сказав: "Я не хочу, щоб під час запуску працював фокус на вхід". Ваше рішення лише приховує клавіатуру, це має суттєву різницю. - katzenhut
найкраще рішення !! Відомий вищевказаний варіант працював для мене. витрачається близько години на цю маленьку річ - Hamza Zaidi
@katzenhut так, ось моя проблема з цією відповіддю точно. Зосередження уваги на моєму текстовому редакторі відкриває активність PlaceAutoComplete, тому ця відповідь неповна - Zach
Ця відповідь була б повною, якщо б було питання: як я завжди можу забезпечити мою активність, ніколи не відображається клавіатура. Котрий немає. - Martin Marconcini