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


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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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


2350


источник


Ответы:


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

<!-- 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"/>

1985



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

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

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

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


1555



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

<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"кажется,   default (целочисленное значение равно 0). Он работает только путем добавления android:focusableInTouchMode="true",

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

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


1004



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

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

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


381



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



using the information provided by other posters, I used the following solution:

in the layout 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"/>

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

and finally, in onResume()

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

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

62



The following will stop edittext from taking focus when created, but grab it when you touch them.

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

So you set focusable to false in the xml, but the key is in the java, which you add the following listener:

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

Because you are returning false, i.e. not consuming the event, the focusing behavior will proceed like normal.


58



Try clearFocus() instead of setSelected(false). Every view in Android has both focusability and selectability, and I think that you want to just clear the focus.


54