[Android] Stoppen Sie, dass EditText beim Aktivitätsstart den Fokus erhält



Answers

Ist das eigentliche Problem, dass Sie nicht wollen, dass es überhaupt Fokus haben? Oder möchten Sie nicht, dass die virtuelle Tastatur durch das EditText von EditText ? Ich sehe nicht wirklich ein Problem mit dem 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 den EditText (und die Tastatur als Ergebnis zu öffnen).

Wenn es sich um das Problem der virtuellen Tastatur handelt, AndroidManifest.xml Dokumentation zu AndroidManifest.xml <Aktivität> .

android:windowSoftInputMode="stateHidden" - android:windowSoftInputMode="stateHidden" immer beim Eingeben der Aktivität aus.

oder android:windowSoftInputMode="stateUnchanged" - ändere es nicht (z. B. zeige es nicht , wenn es nicht bereits angezeigt wird, aber wenn es offen war, wenn du die Aktivität android:windowSoftInputMode="stateUnchanged" , lass es offen).

Question

Ich habe eine Activity in Android mit zwei Elementen:

  1. EditText
  2. ListView

Wenn meine Activity startet, hat EditText sofort einen 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 den EditText davon überzeugen, sich nicht selbst auszuwählen, wenn die Activity startet?




Fügen Sie Folgendes in der onCreate Methode hinzu:

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



Sie können einfach "fokussierbar" und "fokussierbar im Touch-Modus" auf "True" im ersten TextView des layout . Auf diese Weise wird der TextView beim TextView der Aktivität fokussiert, aber aufgrund seiner Art wird nichts auf dem Bildschirm angezeigt und natürlich wird keine Tastatur angezeigt.




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




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

android:windowSoftInputMode="stateHidden"

Manifestdatei:

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



Keine dieser Lösungen funktionierte für mich. Die Art, wie ich den Autofokus repariere, war:

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



"<requestFocus />" Sie darauf, die Zeile "<requestFocus />" aus dem EditText Tag in XML zu entfernen.

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>



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

ListView.requestFocus(); 

in Ihrer onResume() , um den Fokus von der editText zu greifen.

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




Was bei allen Geräten funktioniert, ist für mich:

    <!-- 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 eine Ansicht vor die problematische fokussierte Ansicht, und das war's.




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

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

Und der EditText wird nicht den Fokus erhalten, nachdem er die Aktivität EditText




Ich musste den Fokus von allen Feldern programmatisch entfernen. Ich habe meiner Hauptlayoutdefinition die folgenden zwei Anweisungen hinzugefügt.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

Das ist es. Mein Problem wurde sofort behoben. Danke, Silver, dass du mich in die richtige Richtung weist.




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

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



Da ich das XML nicht gerne mit etwas zu tun habe, das mit Funktionalität zu tun hat, habe ich diese Methode entwickelt, die "transparent" den Fokus von der ersten fokussierbaren Ansicht entfernt 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;
}



onCreate Sie bei onCreate Ihrer Aktivität einfach den clearFocus() in Ihr EditText-Element ein. Beispielsweise,

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

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

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



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





Links