Frage Stoppen Sie, dass EditText beim Aktivitätsstart den Fokus erhält


ich habe ein Activity in Android, mit zwei Elementen:

  1. EditText 
  2. ListView

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

EditText.setSelected(false);

Kein Glück. Wie kann ich das überzeugen? EditText sich nicht selbst auswählen wenn der Activity beginnt?


2386
2017-10-12 15:03


Ursprung


Antworten:


Hervorragende Antworten von Luc und Mark, aber ein gutes Codebeispiel fehlt. Hinzufügen des Tags android:focusableInTouchMode="true" zu <LinearLayout> Wie im folgenden Beispiel wird das Problem behoben.

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

2026
2017-11-02 15:49



Ist das eigentliche Problem, dass Sie nicht wollen, dass es überhaupt Fokus haben? Oder Sie möchten nicht, dass die virtuelle Tastatur als Ergebnis der Fokussierung angezeigt wird EditText? Ich sehe nicht wirklich ein Problem mit der EditText mit Fokus auf Start, aber es ist definitiv ein Problem, das SoftInput-Fenster geöffnet zu haben, wenn der Benutzer nicht ausdrücklich aufgefordert hat, sich auf das zu konzentrieren EditText (und öffnen Sie die Tastatur als Ergebnis).

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

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

oder android:windowSoftInputMode="stateUnchanged" - ändere es nicht (z. B. nicht Show Wenn es nicht bereits angezeigt wird, aber offen ist, wenn Sie die Aktivität eingeben, lassen Sie es offen).


1565
2018-04-09 21:22



Eine einfachere Lösung existiert. 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" >

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

Außerdem können wir den Fokus von untergeordneten Ansichten zur Laufzeit entfernen (z. B. nach Beendigung der untergeordneten Bearbeitung), indem wir den Fokus erneut dem Hauptlayout zuweisen, wie dies hier gezeigt wird:

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

Guter Kommentar von Guillaume Perrot:

android:descendantFocusability="beforeDescendants" scheint der zu sein   Standard (Ganzzahl ist 0). Es funktioniert nur durch Hinzufügen    android:focusableInTouchMode="true".

Wirklich, wir können das sehen beforeDescendants Als Standard in der ViewGroup.initViewGroup() Methode (Android 2.2.2). Aber nicht gleich 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Danke an Guillaume.


1012
2017-12-26 23:35



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

  • Ein ... kreieren LinearLayout (Ich weiß nicht, ob andere Arten von Layouts funktionieren)
  • Legen Sie die Attribute fest android:focusable="true" und android:focusableInTouchMode="true"

Und das EditText wird nach dem Start der Aktivität nicht den Fokus erhalten


385
2017-10-23 08:12



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

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

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

67
2018-03-13 09:57



Unter Verwendung der Informationen anderer Poster verwendete ich die folgende Lösung:

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

und schließlich in onResume ()

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

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

63
2018-05-26 21:07



Im Folgenden wird edittext davon abhalten, den Fokus bei der Erstellung zu verwenden, aber greifen Sie darauf, wenn Sie sie berühren.

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

Sie haben also in der XML-Datei den Fokus auf "Falsch" gesetzt, 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;
    }
});

Weil Sie falsch zurückkehren, d. H. Das Ereignis nicht konsumieren, wird das Fokussierungsverhalten wie normal ablaufen.


58
2018-06-15 04:45