android focus prevent - Stoppen Sie, dass EditText beim Start der Aktivität den Fokus erhält




15 Answers

Ausgezeichnete Antworten von Luc und Mark, jedoch fehlt ein gutes Codebeispiel. Durch Hinzufügen des Tags android:focusableInTouchMode="true" zu <LinearLayout> wie im folgenden Beispiel wird das Problem <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"/>
gets exit

Ich habe eine Activity in Android mit zwei Elementen:

  1. EditText
  2. ListView

Wenn meine Activity beginnt, hat der EditText sofort den Eingabefokus (blinkender Cursor). Ich möchte nicht, dass beim Start eine Kontrolle den Eingabefokus hat. Ich habe es versucht:

EditText.setSelected(false);

Kein Glück. Wie kann ich den EditText davon überzeugen, sich beim Start der Activity nicht selbst auszuwählen?




Es gibt eine einfachere Lösung. Legen Sie diese Attribute in Ihrem übergeordneten Layout fest:

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

Wenn jetzt die Aktivität beginnt, wird dieses Hauptlayout standardmäßig fokussiert.

Außerdem können wir zur Laufzeit den Fokus aus den untergeordneten Ansichten entfernen (z. B. nach dem Beenden der untergeordneten Bearbeitung), indem Sie den Fokus wieder auf das Hauptlayout legen.

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

Guter Kommentar von Guillaume Perrot :

android:descendantFocusability="beforeDescendants" scheint der Standardwert zu sein (ganzzahliger Wert ist 0). Es funktioniert einfach durch Hinzufügen von android:focusableInTouchMode="true" .

Wirklich können wir sehen, dass die beforeDescendants in der ViewGroup.initViewGroup() -Methode (Android 2.2.2) als Standard ViewGroup.initViewGroup() . ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000; aber nicht gleich 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Danke an Guillaume.




Das Problem scheint von einer Eigenschaft zu stammen, die ich nur in der XML form des Layouts sehen kann.

EditText Sie sicher, dass Sie diese Zeile am Ende der Deklaration innerhalb der EditText XML-Tags EditText :

<requestFocus />

Das sollte so etwas geben:

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

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



Im Folgenden wird verhindert, dass Edittext den Fokus erhält, wenn er erstellt wird.

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

Sie setzen also fokussierbar in der XML auf false, aber der Schlüssel befindet sich im Java, dem Sie den folgenden Listener hinzufügen:

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

Da Sie false zurückgeben, dh das Ereignis nicht konsumieren, wird das Fokussierungsverhalten normal fortgesetzt.




Ich hatte mehrere Antworten einzeln ausprobiert, aber der Fokus liegt immer noch auf EditText. Ich habe es nur geschafft, es zu lösen, indem ich zwei der folgenden Lösungen zusammen verwendete.

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

(Referenz von Silver https://.com/a/8639921/15695 )

und entfernen

 <requestFocus />

bei EditText

(Referenz von floydaddict share )




Einfache Lösung: In AndroidManifest im Activity Tag verwenden

android:windowSoftInputMode="stateAlwaysHidden"



Folgendes hat für mich in Manifest . Schreiben ,

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>



Fügen Sie android:windowSoftInputMode="stateAlwaysHidden" im Activity-Tag der Datei Manifest.xml .

Source




Wenn Sie eine andere Ansicht Ihrer Aktivität wie eine ListView , können Sie auch ListView tun:

ListView.requestFocus(); 

in Ihrem onResume() , um den Fokus vom editText .

Ich weiß, dass diese Frage beantwortet wurde, aber nur eine alternative Lösung bereitstellt, die für mich funktioniert hat :)




Fügen Sie Folgendes in der onCreate Methode hinzu:

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



Da ich das XML nicht gerne mit etwas verschmutzen möchte, das mit der Funktionalität zusammenhängt, habe ich diese Methode entwickelt, die "transparent" den Fokus aus der ersten fokussierbaren Ansicht stiehlt und sich dann bei Bedarf selbst entfernt!

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



Schreiben Sie diese Zeile in Ihr übergeordnetes Layout ...

 android:focusableInTouchMode="true"



Dies ist die perfekte und einfachste Lösung. Ich verwende dies immer in meiner App.

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



Schreiben Sie diesen Code in die Manifest Datei in der Activity in der Sie die Tastatur nicht öffnen möchten.

android:windowSoftInputMode="stateHidden"

Manifest-Datei:

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



onCreate Sie bei onCreate Ihrer Aktivität einfach use clearFocus() zu Ihrem EditText-Element hinzu. Zum Beispiel,

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

Wenn Sie den Fokus auf ein anderes Element umleiten möchten, verwenden Sie requestFocus() . Zum Beispiel,

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



Related