Frage

Ich habe eine Activity in Android, mit zwei Elementen:

  1. EditText
  2. ListView

Wenn mein Activity beginnt, sofort die EditText Eingabefokus hat (blinkender Cursor). Ich will keinen Steuereingang beim Start Fokus haben. Ich habe versucht:

EditText.setSelected(false);

Glück Nein. Wie kann ich überzeugen die EditText nicht selbst wählen, wenn die Activity beginnt?

War es hilfreich?

Lösung

Ausgezeichnete Antworten von Luc und Mark jedoch ein gutes Codebeispiel fehlen. Das Hinzufügen der Tag android:focusableInTouchMode="true" zu <LinearLayout> wie das folgende Beispiel wird das Problem beheben.

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

Andere Tipps

Ist das eigentliche Problem, dass Sie nur wollen es nicht Fokus überhaupt haben? Oder Sie wollen es nicht der Fokussierung des EditText die virtuelle Tastatur als Ergebnis zeigen? Ich sehe nicht wirklich ein Problem mit den EditText Fokus auf Start zu haben, aber es ist definitiv ein Problem, das softInput Fenster offen zu haben, wenn der Benutzer explizit nicht auf dem EditText konzentrieren fordern (und öffnen Sie die Tastatur als Ergebnis).

Wenn es das Problem der virtuellen Tastatur ist, finden Sie in dem AndroidManifest.xml -Element Dokumentation.

android:windowSoftInputMode="stateHidden" -. Immer es verstecken, wenn die Aktivität der Eingabe

oder android:windowSoftInputMode="stateUnchanged" - nicht ändern, es nicht (zB nicht Show es, wenn es nicht bereits angezeigt wird, aber wenn es offen war, als die Aktivität eintritt, lassen Sie es öffnet)

Eine einfachere Lösung besteht. Setzen Sie diese Attribute in Ihrer Mutter Layout:

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

Und nun, wenn die Aktivität dieses Haupt Layout beginnt wird Fokus standardmäßig erhalten.

Außerdem können wir den Fokus von Kind Ansichten zur Laufzeit entfernen (zum Beispiel nach dem Kind Bearbeitung Schlichten) durch den Fokus auf das Haupt Layout geben wieder, wie folgt aus:

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

Guter Kommentar Guillaume Perrot :

  

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

siehe

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

Dank Guillaume.

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

  • Erstellen Sie eine Linearlayout (ich weiß nicht, ob andere Arten von Layout-Willen Arbeit)
  • Stellen Sie die Attribute android:focusable="true" und android:focusableInTouchMode="true"

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

Das Problem scheint aus einer Eigenschaft zu kommen, dass ich nur in der XML form des Layouts sehen.

Achten Sie darauf, diese Zeile am Ende der Deklaration innerhalb der EditText XML-Tags zu entfernen:

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

unter Verwendung der Informationen von anderen Plakaten zur Verfügung gestellt, habe 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();
}

Versuchen Sie clearFocus () statt setSelected(false). Jede Ansicht in Android sowohl Fokussierbarkeit und Wählbarkeit hat, und ich denke, dass Sie nur wollen, um den Fokus zu löschen.

Im Folgenden wird EditText daran Fokus zu stoppen, wenn erstellt, aber es greifen, wenn man sie berührt.

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

So Sie setzen fokussierbar auf false im xml, aber der Schlüssel ist in der Java, mit dem Sie die folgenden Zuhörer hinzu:

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ückgeben, das heißt nicht das Ereignis raubend, wird die Fokussierung Verhalten wie normale gehen.

hatte ich mehrere Antworten einzeln versucht, aber der Fokus liegt nach wie vor auf der EditText. Ich schaffte es nur zu lösen, indem sie zusammen zwei der folgenden Lösung.

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

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

und entfernen

 <requestFocus />

bei EditText

(Referenz von floydaddict https://stackoverflow.com/a/9681809 )

Späte aber einfachste Antwort, fügen Sie einfach diese in übergeordnetem Layout des XML.

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

Upvote wenn es Ihnen geholfen! Glücklich Codierung:)

Keine dieser Lösungen für mich gearbeitet. So wie ich den Autofokus zu beheben war:

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

Einfache Lösung: In AndroidManifest in Activity-Tag

android:windowSoftInputMode="stateAlwaysHidden"

Sie können einfach eingestellt "fokussierbar" und "fokussierbar im Touchbetrieb" auf dem Wert wahr auf dem ersten TextView der layout. Auf diese Weise, wenn die Aktivität beginnt wird der TextView aber fokussiert werden, aufgrund ihrer Art, werden Sie nichts sehen auf dem Bildschirm fokussiert und natürlich wird es nicht Tastatur angezeigt ...

Im Folgenden arbeitete für mich in Manifest. Schreiben Sie,

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

ich klare Fokussierung benötigt aus allen Bereichen programmatisch. Ich habe gerade die beiden folgenden Aussagen zu meinem Haupt-Layout-Definition hinzugefügt.

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

Das ist es. sofort behoben mein Problem. Danke, Silber, für mich in der richtigen Richtung.

Fügen Sie android:windowSoftInputMode="stateAlwaysHidden" in dem Aktivitäts-Tag der Manifest.xml Datei.

Quelle

Wenn Sie einen anderen Blick auf Ihre Aktivität wie ein ListView haben, können Sie auch tun:

ListView.requestFocus(); 

in Ihrem onResume() zu greifen Fokus von den editText.

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

Fügen Sie folgende in onCreate Methode:

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

Versuchen Sie, diese vor dem ersten Editierfeldes:

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

Ist, dass ich weiß nicht, wie die XML mit etwas verschmutzen, der Funktionalität verwendet ist, habe ich diese Methode, dass „transparent“ stiehlt den Fokus von dem ersten fokussierbaren Blick und sorge dann dafür, mich zu entfernen, wenn nötig!

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

Späte, aber vielleicht hilfreich. Erstellen Sie einen Dummy-EditText an der Spitze des Layouts dann rufen myDummyEditText.requestFocus() in onCreate()

<EditText android:id="@+id/dummyEditTextFocus" 
android:layout_width="0px"
android:layout_height="0px" />

Das scheint zu verhalten, wie ich erwarte. Keine Notwendigkeit, Griff Konfigurationsänderungen usw. Ich musste dies für eine Aktivität mit einer langen Textview (Anweisungen).

Ja, ich das gleiche tat - schaffen ein ‚Dummy‘ lineare Layout, das bekommt anfänglichen Fokus. Darüber hinaus stelle ich den ‚next‘ Fokus-IDs so dass der Benutzer es nicht mehr konzentrieren kann nach dem Scrollen einmal:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

eine Menge Arbeit nur auf einem Blick lose Fokus zu erhalten ..

Danke

Für mich, was auf allen Geräten gearbeitet, ist dies:

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

Gerade hätte dies als eine Ansicht vor der problematischen fokussierte Sicht, und das ist es.

Schreiben Sie diese Zeile in Ihrer Eltern-Layout ...

 android:focusableInTouchMode="true"

Dies ist die perfekte und einfachste solution.I dies immer in meiner Anwendung verwenden.

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

Die einfachste Sache, die ich tat, ist auf den Schwerpunkt auf eine andere Ansicht in onCreate:

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

Dies stoppte die Soft-Tastatur kommen und es gab keinen Cursor im EditText blinkt.

Notieren Sie sich diesen Code in Manifest Datei im Activity wo Sie nicht wollen, um die Tastatur zu öffnen.

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

Bei onCreate Ihrer Aktivität, nur Gebrauch clearFocus() auf Ihrem EditText Element hinzufügen. Zum Beispiel:

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

Und wenn Sie den Fokus auf ein anderes Element abzulenken, benutzen Sie requestFocus() darauf. Zum Beispiel:

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

Sie können dies erreichen, indem ein Dummy-EditText mit Layout Breite und Höhe Satz 0dp Erstellen und Anforderung Fokus zu dieser Ansicht. Fügen Sie den folgenden Code-Schnipsel in Ihrem XML-Layout:

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top