Automatyczne wyświetlanie klawiatury przy rozpoczęciu działania


97

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?


Sprawdź moją odpowiedź na to pytanie stackoverflow.com/questions/39593324/ ...
— Pomoc Androida

Gdy Moja aplikacja jest uruchomiona (otwarta) i dostępny jest widok edycji tekstu, klawiatura jest włączona automatycznie (pokaż). Jak rozwiązać ten problem, kliknij tutaj easycomacademy.com/…
— AhmadUllah Ahmad

Odpowiedzi:


209

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, ScrollViewdlatego musisz dodać te atrybuty do głównego elementu podrzędnego ScrollView.


3
To rozwiązało również mój problem. Dodałem to do tagu RelativeLayout dla mojej aktywności. Dziękuję Ci!
— Luke,

21
Co ciekawe, nie zadziałało, kiedy dodałem powyższe do ScrollView, ale zadziałało dla LinearLayout
— Jerry Brady

1
Myślę, że musisz umieścić to na najwyższym układzie
— Utsav Gupta

Więc myślę, że to działa, ponieważ mówisz samemu układowi, że może mieć fokus? W przeciwnym razie zakłada, że ​​musi skupić się na pierwszej kontroli formularza? Co dziwne, otrzymywałem klawiaturę, nawet jeśli wszystkie elementy sterujące w moim formularzu były wyłączone. Naprawiono teraz. Dziękuję Ci!
— crowmagnumb

1
Należy zauważyć, że to rozwiązanie stwarza problemy z dostępnością (widok, który nie powinien być fokusem, jest oznaczony jako mający fokus) i może mieć niezamierzone konsekwencje.
— Renato

96

Możesz dodać to do swojej aktywności w Android Manifest:

android:windowSoftInputMode="stateHidden|adjustResize"

Działa to jednak, jeśli masz tło obrazu i martwisz się, że Twoja miękka klawiatura zmniejszy takie tło obrazu, użyjandroid:windowSoftInputMode="stateHidden|adjustPan"
— ArtiomLK

31

Mam kilka opisanych tutaj implementacji, ale teraz dodałem do AndroidManifest.xmldla mojej Activitynieruchomości:

android:windowSoftInputMode="stateAlwaysHidden"

Myślę, że to łatwy sposób, nawet jeśli używasz fragments.

" stateAlwaysHidden " Klawiatura programowa jest zawsze ukryta, gdy fokus jest wprowadzany w głównym oknie działania.


to działało dla mnie zarówno z ScrollView, jak i RelativeLayout.
— iversoncru

Nie jest to zbyt dobre dla fragmentów, ponieważ kojarzysz „stan ukryty” z działaniem, które będzie zawierało wszystkie Twoje fragmenty, co oznacza, że ​​na każdy fragment, który chcesz wyświetlić w działaniu, będzie miała wpływ właściwość (a nie „na fragment” " podstawa).
— Pelpotronic

11

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


5

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



3

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 EditTextw 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 EditTextw layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Prawdopodobnie jest więcej możliwości optymalizacji kodu.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

użycie fragmentu ... ten kod działa, aby ukryć klawiaturę ... gdy fragment jest otwarty, unikaj skupiania się na klawiaturze pola edittext ...
— Sreelal S

2

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.


1

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

1

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.


1

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


0

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.


0

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


Pytanie brzmiało, jak zapobiec otwieraniu się klawiatury.
— jk7


0

Dodaj poniższy kod na początku pliku XML aktywności i upewnij się, że widok znajduje się nad EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Dodaj powyższą linię do xml EditTextlub TextInputLayoutktóra ma fokus i powoduje softInputKeyboardwyskakiwanie.

To rozwiązało problem i teraz klawiatura nie wyskakuje


0

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


W swojej odpowiedzi musisz podać wszelkie ograniczenia, założenia lub uproszczenia. Więcej informacji na temat odpowiedzi znajdziesz pod tym linkiem: stackoverflow.com/help/how-to-answer
— Usama Abdulrehman

-1

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.


Zrobiłem to, ale klawiatura nadal się pojawia, a fokus jest na editText.
— David Doria
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.