Mam stosunkowo proste pytanie. Mam aktywność z dużą ilością EditText'ów. Kiedy otwieram działanie, automatycznie koncentruje się na pierwszym EditText i wyświetla wirtualną klawiaturę.
Jak mogę temu zapobiec?
Mam stosunkowo proste pytanie. Mam aktywność z dużą ilością EditText'ów. Kiedy otwieram działanie, automatycznie koncentruje się na pierwszym EditText i wyświetla wirtualną klawiaturę.
Jak mogę temu zapobiec?
Odpowiedzi:
Użyj tych atrybutów w swoim tagu układu w pliku XML:
android:focusable="true"
android:focusableInTouchMode="true"
Jak informują inni członkowie w komentarzach, to nie działa, ScrollView
dlatego musisz dodać te atrybuty do głównego elementu podrzędnego ScrollView
.
Możesz dodać to do swojej aktywności w Android Manifest:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
Mam kilka opisanych tutaj implementacji, ale teraz dodałem do AndroidManifest.xml
dla mojej Activity
nieruchomości:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " Klawiatura programowa jest zawsze ukryta, gdy fokus jest wprowadzany w głównym oknie działania.
Jeśli masz inny widok na swoją aktywność, taki jak a ListView
, możesz również:
ListView.requestFocus();
w swoim onResume (), aby pobrać fokus z pliku editText
.
Wiem, że odpowiedź na to pytanie została udzielona, ale zapewniam tylko alternatywne rozwiązanie, które zadziałało dla mnie :)
https://stackoverflow.com/a/11627976/5217837 To jest prawie poprawne:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Ale powinno to być raczej SOFT_INPUT_STATE_HIDDEN niż SOFT_INPUT_STATE_ALWAYS_VISIBLE
Użyj tego w kodzie swojej aktywności:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Miałem podobny problem, nawet podczas przełączania kart klawiatura pojawiała się automatycznie i pozostawała włączona, z Androidem 3.2.1 na tablecie. Użyj następującej metody:
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 );
}
}
W onCreate () i onPause () działania dla każdego EditText:
setEditTextFocus (myEditText, false);
Dla każdego EditText i OnTouchListener:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
Dla każdego EditText
w OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
I dla każdego EditText
w layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Prawdopodobnie jest więcej możliwości optymalizacji kodu.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Znalazłem to proste rozwiązanie, które zadziałało. Ustaw następujące atrybuty w układzie nadrzędnym:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
A teraz, gdy czynność się rozpocznie, ten główny układ zostanie domyślnie ustawiony.
Możemy również usunąć fokus z widoków podrzędnych w czasie wykonywania, ponownie ustawiając fokus na głównym układzie, na przykład:
findViewById(R.id.mainLayout).requestFocus();
Mam nadzieję, że to zadziała.
to jest rozwiązanie, którego używam, nie jest to najlepsze rozwiązanie, ale działa dobrze
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;
}});
Co ciekawe, w tej dokumentacji https://developer.android.com/training/keyboard-input/visibility.html stwierdza się, że kiedy czynność się rozpoczyna i fokus jest przenoszony na pole tekstowe, klawiatura programowa nie jest wyświetlana (a następnie przechodzi do pokaże ci, jak wyświetlić klawiaturę, jeśli chcesz z jakimś kodem).
Na moim Samsungu Galaxy S5 tak działa moja aplikacja (bez wpisu manifestu lub określonego kodu) - bez miękkiej klawiatury. Jednak na Lollipop AVD jest pokazana miękka klawiatura - wbrew powyższej dokumentacji.
Jeśli zauważysz takie zachowanie podczas testowania w AVD, możesz przetestować na prawdziwym urządzeniu, aby zobaczyć, co się stanie.
To ma kilka dobrych odpowiedzi w następującym poście: Zatrzymaj EditText przed uzyskaniem fokusu podczas uruchamiania działania . Ten, którego regularnie używam, to następujący kod Morgana :
<!-- 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"/>
UWAGA: Atrapa musi być UMIESZCZONA PRAWO PRZED elementem, na który można ustawić ostrość.
I myślę, że powinno działać idealnie nawet ze ScrollView i nie miał też żadnych problemów z dostępnością.
Dzieje się tak, gdy EditText automatycznie otrzymuje fokus, gdy zaczyna się Twoja aktywność. Tak więc jednym z łatwych i stabilnych sposobów rozwiązania tego problemu jest po prostu ustawienie początkowego fokusu na dowolny inny widok, taki jak przycisk itp.
Możesz to zrobić w swoim układzie XML, bez kodu.
Zaakceptowana odpowiedź nie działa dla mnie, dlatego daj odpowiedź działające rozwiązanie, może być pomocne!
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));
Teraz klawiatura jest otwarta ciesz się :)
android: windowSoftInputMode = "stateHidden | adjustResize"
Pracować w porządku
android:focusableInTouchMode="true"
Dodaj powyższą linię do xml EditText
lub TextInputLayout
która ma fokus i powoduje softInputKeyboard
wyskakiwanie.
To rozwiązało problem i teraz klawiatura nie wyskakuje
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));
To działa dla mnie, chłopaki, fragment może mieć inną składnię. TO DZIAŁA DLA AKTYWNOŚCI
Jeśli twój widok ma EditText i Listview, klawiatura otworzy się domyślnie. Aby domyślnie ukryć wyświetlanie klawiatury, wykonaj następujące czynności
this.listView.requestFocus();
Upewnij się, że żądasz skupienia się na widoku listy po uzyskaniu widoku dla editText.
Np
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
Jeśli to zrobisz, editText uzyska fokus i pojawi się klawiatura.