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



prevent gets (25)

Versuchen Sie es mit clearFocus() anstelle von setSelected(false) . Jede Ansicht in Android ist sowohl fokussierbar als auch wählbar, und ich denke, Sie möchten nur den Fokus löschen.

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?


Ist das eigentliche Problem, dass Sie nicht wollen, dass es überhaupt einen Fokus hat? Oder Sie möchten nicht, dass die virtuelle Tastatur als Ergebnis der Fokussierung des EditText ? Ich sehe eigentlich kein Problem mit dem EditText Fokus beim Start, aber es ist definitiv ein Problem, wenn das softInput-Fenster geöffnet ist, wenn der Benutzer nicht ausdrücklich aufgefordert hat, sich auf den EditText (und als Ergebnis die Tastatur zu öffnen).

Wenn es sich um das Problem der virtuellen Tastatur handelt, AndroidManifest.xml Dokumentation zum AndroidManifest.xml Element <activity> .

android:windowSoftInputMode="stateHidden" - verstecken Sie es immer, wenn Sie die Aktivität android:windowSoftInputMode="stateHidden" .

oder android:windowSoftInputMode="stateUnchanged" - ändern Sie es nicht ( zeigen Sie es nicht an , wenn es nicht bereits angezeigt wird, aber wenn es bei der Eingabe der Aktivität geöffnet war, lassen Sie es geöffnet).


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

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

Sie können einfach "fokussierbar" und "fokussierbar im Touch-Modus" auf "true" in der ersten TextView des layout TextView . Auf diese Weise wird die TextView zu Beginn der TextView fokussiert, aber aufgrund ihrer Beschaffenheit werden auf dem Bildschirm nichts fokussiert und natürlich wird keine Tastatur angezeigt ...


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

Probieren Sie dies vor Ihrem ersten bearbeitbaren Feld aus:

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

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

Ja, ich habe das Gleiche getan - ein lineares Layout 'Dummy' erstellen, das den anfänglichen Fokus erhält. Außerdem setze ich die 'nächsten' Fokus-IDs, damit der Benutzer sie nach einem Bildlauf nicht mehr scharf stellen kann:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

eine Menge Arbeit, nur um den Blick auf einen Blick loszuwerden ..

Vielen Dank


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>

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"

Fügen Sie Folgendes in der onCreate Methode hinzu:

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

Die einzige Lösung, die ich gefunden habe, ist:

  • Erstellen Sie ein LinearLayout (Ich weiß nicht, ob andere Layouts funktionieren)
  • Setzen Sie die Attribute android:focusable="true" und android:focusableInTouchMode="true"

Und der EditText erhält nach dem Start der Aktivität nicht den Fokus


Sie können dies erreichen, indem Sie einen Dummy- EditText mit einer EditText und -höhe von 0dp und den Fokus auf diese Ansicht anfordern. Fügen Sie das folgende Code-Snippet in Ihrem XML-Layout hinzu:

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>

Für mich funktionierte auf allen Geräten Folgendes:

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

Setzen Sie dies einfach als Ansicht vor die problematische fokussierte Ansicht, und das ist es.


Die einfachste Antwort, fügen Sie dies einfach im übergeordneten Layout des XML ein.

android:focusable="true" 
android:focusableInTouchMode="true"

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

Source


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

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 )


Keine dieser Lösungen hat für mich funktioniert. So korrigiere ich den Autofokus:

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

Folgendes hat für mich in Manifest . Schreiben ,

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

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 :)


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>

Ändern Sie Ihr Manifest-XML, um windowSoftInputMode in Ihrer Aktivität hinzuzufügen:

<activity
    android:name=".YourActivity"
    android:windowSoftInputMode="adjustPan">
</activity>




android listview android-edittext