Stop EditText von Fokus auf Aktivität Start gewinnt
-
20-09-2019 - |
Frage
Ich habe eine Activity
in Android, mit zwei Elementen:
-
EditText
-
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?
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
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 :
siehe
android:descendantFocusability="beforeDescendants"
scheint der zu sein, default (ganzzahliger Wert ist 0). Es funktioniert einfach durch Hinzufügenandroid:focusableInTouchMode="true"
.
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"
undandroid: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.
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>