Остановите EditText от получения фокуса при запуске Activity - PullRequest
2679 голосов
/ 12 октября 2009

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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

Ответы [ 49 ]

2360 голосов
/ 02 ноября 2009

Отличные ответы от Люка и Марка, но хороший пример кода отсутствует. Добавление тега 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"/>
1635 голосов
/ 10 апреля 2010

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

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

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

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

1087 голосов
/ 27 декабря 2011

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

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

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

412 голосов
/ 23 октября 2009

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

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

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

75 голосов
/ 13 марта 2012

Проблема, похоже, связана со свойством, которое я вижу только в 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>
69 голосов
/ 27 мая 2011

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

в макете 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();
}
67 голосов
/ 12 октября 2009

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

66 голосов
/ 15 июня 2012

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

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

56 голосов
/ 28 ноября 2012

Я пробовал несколько ответов по отдельности, но фокус все еще на 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

(Справка из Флойдаддикта https://stackoverflow.com/a/9681809)

42 голосов
/ 30 ноября 2011

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

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...