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.