studio - prevent edittext focus android




Stoppen Sie, dass EditText beim Start der Aktivität den Fokus erhält (20)

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?


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

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

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

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

Die einfachste Sache, die ich gemacht habe, ist, mich auf eine andere Ansicht in onCreate zu konzentrieren:

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

Dadurch wurde die Soft-Tastatur angehalten und im EditText blitzte kein Cursor.


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

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

Einfache Lösung: In AndroidManifest im Activity Tag verwenden

android:windowSoftInputMode="stateAlwaysHidden"

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

Source


Fügen Sie Folgendes in der onCreate Methode hinzu:

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

Folgendes hat für mich in Manifest . Schreiben ,

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

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 )


Ich verwendete die Informationen, die von anderen Postern bereitgestellt wurden, und benutzte 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();
}

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.


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


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>

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

 android:focusableInTouchMode="true"

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>

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


Spät, aber vielleicht hilfreich. Erstellen Sie einen Dummy-EditText am oberen Rand Ihres Layouts und rufen myDummyEditText.requestFocus() dann myDummyEditText.requestFocus() in onCreate()

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

Das scheint sich wie erwartet zu verhalten. Keine Notwendigkeit, Konfigurationsänderungen zu handhaben, usw. Ich brauchte dies für eine Aktivität mit einer langen Textansicht (Anweisungen).


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


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




android-edittext