Ich habe eine relativ einfache Frage. Ich habe eine Aktivität mit vielen EditText-Inhalten. Wenn ich die Aktivität öffne, wird automatisch auf den ersten EditText fokussiert und die virtuelle Tastatur angezeigt.
Wie kann ich das verhindern?
Ich habe eine relativ einfache Frage. Ich habe eine Aktivität mit vielen EditText-Inhalten. Wenn ich die Aktivität öffne, wird automatisch auf den ersten EditText fokussiert und die virtuelle Tastatur angezeigt.
Wie kann ich das verhindern?
Antworten:
Verwenden Sie diese Attribute in Ihrem Layout-Tag in einer XML-Datei:
android:focusable="true"
android:focusableInTouchMode="true"
Wie von anderen Mitgliedern in Kommentaren berichtet, funktioniert es nicht, ScrollView
daher müssen Sie diese Attribute dem Hauptkind von hinzufügen ScrollView
.
Sie können dies zu Ihrer Android Manifest-Aktivität hinzufügen:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
Ich habe mehrere Implementierungen hier beschrieben, aber jetzt habe ich die AndroidManifest.xml
für meine Activity
Eigenschaft hinzugefügt :
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " Die Softtastatur wird immer ausgeblendet, wenn das Hauptfenster der Aktivität einen Eingabefokus hat.
Wenn Sie eine andere Ansicht zu Ihrer Aktivität haben als a ListView
, können Sie auch Folgendes tun:
ListView.requestFocus();
in Ihrem onResume (), um den Fokus von der zu erhalten editText
.
Ich weiß, dass diese Frage beantwortet wurde, aber nur eine alternative Lösung bietet, die für mich funktioniert hat :)
https://stackoverflow.com/a/11627976/5217837 Dies ist fast richtig:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Es sollte jedoch SOFT_INPUT_STATE_HIDDEN und nicht SOFT_INPUT_STATE_ALWAYS_VISIBLE sein
Verwenden Sie dies im Code Ihrer Aktivität:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Ich hatte ein ähnliches Problem, selbst wenn ich zwischen den Registerkarten wechselte, tauchte die Tastatur automatisch auf und blieb mit Android 3.2.1 auf einem Tablet auf. Verwenden Sie die folgende Methode:
public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
} else {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
}
}
In onCreate () und onPause () der Aktivität für jeden EditText:
setEditTextFocus (myEditText, false);
Für jeden EditText einen OnTouchListener:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
Für jeden EditText
in der OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
Und für jeden EditText
in der layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Es ist wahrscheinlich mehr Codeoptimierung möglich.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Ich habe diese einfache Lösung gefunden, die für mich funktioniert hat. 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 zur Laufzeit aus den untergeordneten Ansichten entfernen, indem wir den Fokus erneut auf das Hauptlayout legen, wie folgt:
findViewById(R.id.mainLayout).requestFocus();
Hoffe es wird für dich funktionieren.
Dies ist die Lösung, die ich verwende. Sie ist nicht die beste Lösung, aber sie funktioniert gut für mich
editComment.setFocusableInTouchMode(false);
editComment.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
editComment.setFocusableInTouchMode(true);
editComment.requestFocus() ;
return false;
}});
Interessanterweise ist diese Dokumentation https://developer.android.com/training/keyboard-input/visibility.html , dass beim einer Aktivität und beim Fokussieren auf ein Textfeld die Softtastatur nicht angezeigt wird (und dann weitergeht) zeigen Ihnen, wie Sie die Tastatur anzeigen lassen können, wenn Sie Code verwenden möchten).
Auf meinem Samsung Galaxy S5 funktioniert meine App (ohne Manifesteintrag oder spezifischen Code) so - ohne Softtastatur. Auf einer Lollipop AVD wird jedoch eine Softtastatur angezeigt, die gegen das oben angegebene Dokument verstößt.
Wenn dieses Verhalten beim Testen in einer AVD auftritt, möchten Sie möglicherweise auf einem realen Gerät testen, um zu sehen, was passiert.
Dies hat einige gute Antworten im folgenden Beitrag: Verhindern Sie, dass EditText beim Start der Aktivität den Fokus erhält . Ich verwende regelmäßig den folgenden Code von Morgan :
<!-- 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"/>
HINWEIS : Das Dummy-Objekt muss direkt vor dem fokussierbaren Element platziert werden.
Und ich denke, es sollte auch mit ScrollView perfekt funktionieren und hatte auch hier keine Probleme mit der Barrierefreiheit.
Dies tritt auf, wenn Ihr EditText automatisch den Fokus erhält, wie wenn Ihre Aktivität beginnt. Eine einfache und stabile Möglichkeit, dies zu beheben, besteht darin, den anfänglichen Fokus auf eine andere Ansicht wie eine Schaltfläche usw. zu setzen.
Sie können dies in Ihrem Layout-XML tun, ohne dass Code erforderlich ist.
Akzeptierte Antwort funktioniert bei mir nicht, deshalb geben Antwort Antwort funktionierende Lösung, vielleicht ist es hilfreich!
EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Jetzt ist die Tastatur geöffnet, viel Spaß :)
android: windowSoftInputMode = "stateHidden | adjustResize"
Funktioniert gut
android:focusableInTouchMode="true"
Fügen Sie die obige Zeile zu xml von EditText
oder hinzu, TextInputLayout
das den Fokus hat und das verursachtsoftInputKeyboard
angezeigt wird.
Dies hat das Problem für uns gelöst und jetzt erscheint die Tastatur nicht mehr
search_edit_text = (EditText) findViewById (R.id.search_edit_text);
search_edit_text.requestFocus();
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Dies funktioniert für mich Jungs Fragment kann eine andere Syntax haben. DAS FUNKTIONIERT FÜR AKTIVITÄT
Wenn Ihre Ansicht über EditText und Listenansicht verfügt, wird die Tastatur standardmäßig geöffnet. Gehen Sie wie folgt vor, um zu verhindern, dass die Tastatur standardmäßig angezeigt wird
this.listView.requestFocus();
Stellen Sie sicher, dass Sie den Fokus auf die Listenansicht anfordern, nachdem Sie die Ansicht für editText erhalten haben.
Zum Beispiel
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
Wenn Sie dies tun, wird editText fokussiert und die Tastatur wird eingeblendet.