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

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

  • EditText
  • ListView

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

EditText.setSelected(false);

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

2130
задан Mark 12 окт. '09 в 18:03
источник поделиться
45 ответов
  • 1
  • 2

Отличные ответы от Люка и Марка, однако хороший образец кода отсутствует:

<!-- 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"/>
1787
ответ дан Morgan Christiansson 02 нояб. '09 в 18:49
источник поделиться

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

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

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

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

1487
ответ дан Joe 10 апр. '10 в 0:22
источник поделиться

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

<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();

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

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

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

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

926
ответ дан Silver 27 дек. '12 в 2:35
источник поделиться

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

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

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

348
ответ дан Luc 23 окт. '09 в 11:12
источник поделиться

Проблема возникает из свойства, которое я могу видеть только в 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>
60
ответ дан floydaddict 13 марта '12 в 12: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);
}

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

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

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}
54
ответ дан Someone Somewhere 27 мая '11 в 0:07
источник поделиться

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

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

Итак, вы устанавливаете 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, то есть не потребляете событие, поведение фокусировки будет продолжаться как обычно.

52
ответ дан MinceMan 15 июня '12 в 7:45
источник поделиться

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

46
ответ дан Konklone 12 окт. '09 в 22:02
источник поделиться

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

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

(Ссылка из Silver qaru.site/questions/392/...)

и удалите

 <requestFocus />

в EditText

(Ссылка от floydaddict qaru.site/questions/392/...)

39
ответ дан Lee Yi Hong 28 нояб. '12 в 13:32
источник поделиться

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

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>
31
ответ дан rallat 30 нояб. '11 в 19:37
источник поделиться

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

android:windowSoftInputMode="stateAlwaysHidden"
29
ответ дан Sergey Sheleg 17 марта '14 в 18:42
источник поделиться

Вы можете просто установить "фокусируемое" и "фокусируемое в касании" значение true в первом TextView layout. Таким образом, при запуске активности TextView будет сфокусирован, но по своей природе вы не увидите ничего сосредоточенного на экране и, конечно же, будет отображаться клавиатура no...

26
ответ дан Zeus 06 нояб. '11 в 19:49
источник поделиться

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

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
24
ответ дан Babar Sanah 08 апр. '14 в 14:48
источник поделиться

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

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

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

21
ответ дан jakeneff 28 сент. '12 в 2:35
источник поделиться

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

Источник

21
ответ дан prgmrDev 24 июня '15 в 12:19
источник поделиться

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

ListView.requestFocus(); 

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

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

15
ответ дан Sid 07 марта '11 в 22:37
источник поделиться

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

<TextView  
        android:id="@+id/dummyfocus" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="@string/foo"
        />

----

findViewById(R.id.dummyfocus).setFocusableInTouchMode(true);
findViewById(R.id.dummyfocus).requestFocus();
15
ответ дан Jack Slater 12 июня '11 в 0:17
источник поделиться

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

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
13
ответ дан Vishal Raj 21 дек. '15 в 18:33
источник поделиться

Будучи тем, что я не люблю загрязнять 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;
}
12
ответ дан Takhion 24 апр. '13 в 16:26
источник поделиться

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

<EditText android:id="@+id/dummyEditTextFocus" 
android:layout_width="0px"
android:layout_height="0px" />

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

11
ответ дан Jim 13 февр. '11 в 4:58
источник поделиться

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

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

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

Спасибо

10
ответ дан mark 23 окт. '09 в 17:23
источник поделиться

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

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

    <View
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

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

8
ответ дан android developer 14 мая '14 в 11:02
источник поделиться

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
7
ответ дан user4728480 31 марта '15 в 12:27
источник поделиться

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

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

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

7
ответ дан Lumis 03 янв. '13 в 9:57
источник поделиться

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

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

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

button = (Button) findViewById(R.id.button);
button.requestFocus();
5
ответ дан Compaq LE2202x 23 мая '13 в 13:42
источник поделиться

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

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>
4
ответ дан Muhammad Aamir Ali 31 мая '13 в 13:47
источник поделиться

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

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>
4
ответ дан Ish 14 июня '15 в 0:50
источник поделиться
<TextView
    android:id="@+id/TextView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"
    style="@android:style/Widget.EditText"/>
4
ответ дан atul 14 февр. '12 в 7:56
источник поделиться

Запишите эту строку в родительском макете...

 android:focusableInTouchMode="true"
3
ответ дан Vishal Vaishnav 26 июля '17 в 12:52
источник поделиться

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

android:windowSoftInputMode="stateHidden"

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

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>
3
ответ дан Tarit Ray 22 сент. '16 в 17:04
источник поделиться
  • 1
  • 2

Другие вопросы по меткам