Tastiera a comparsa automatica all'avvio dell'attività


97

Ho una domanda relativamente semplice. Ho un'attività con molti EditText al loro interno. Quando apro l'attività, si focalizza automaticamente sul primo EditText e visualizza la tastiera virtuale.

Come posso impedirlo?


Controlla la mia risposta a questa domanda stackoverflow.com/questions/39593324/…
Guida Android

Quando la mia app è avvia (aperta) e se la visualizzazione di modifica del testo è disponibile, la tastiera è abilitata automaticamente (mostra). Come risolvere questo problema clicca qui easycomacademy.com/…
AhmadUllah Ahmad

Risposte:


209

Utilizza questi attributi nel tag di layout nel file XML:

android:focusable="true"
android:focusableInTouchMode="true"

Come riportato da altri membri nei commenti, non funziona ScrollViewquindi è necessario aggiungere questi attributi al figlio principale di ScrollView.


3
Questo ha risolto anche il mio problema. L'ho aggiunto al tag RelativeLayout per la mia attività. Grazie!
Luca

21
È interessante notare che non ha funzionato quando ho aggiunto quanto sopra a ScrollView, ma ha funzionato per un LinearLayout
Jerry Brady

1
Penso che tu debba metterlo sul layout più alto
Utsav Gupta

Quindi immagino che funzioni perché stai dicendo al layout stesso che può essere focalizzato? Altrimenti si presume di dover dare il focus al primo controllo sul form? Stranamente, stavo ottenendo la tastiera anche se tutti i controlli sul mio modulo erano disabilitati. Risolto ora. Grazie!
crowmagnumb

1
È importante notare che questa soluzione crea problemi di accessibilità (una vista che non dovrebbe essere focalizzabile essendo contrassegnata come focalizzata) e potrebbe avere conseguenze indesiderate.
Renato

96

Puoi aggiungerlo alla tua attività Manifest di Android:

android:windowSoftInputMode="stateHidden|adjustResize"

Funziona, tuttavia se hai un'immagine di sfondo e sei preoccupato che la tua tastiera morbida android:windowSoftInputMode="stateHidden|adjustPan"
riduca

31

Ho diverse implementazioni descritte qui, ma ora ho aggiunto nella AndroidManifest.xmlmia Activityproprietà:

android:windowSoftInputMode="stateAlwaysHidden"

Penso che questo sia il modo più semplice anche se stai usando fragments.

" stateAlwaysHidden " La tastiera virtuale è sempre nascosta quando la finestra principale dell'attività ha il focus di input.


questo ha funzionato per me sia con ScrollView che con RelativeLayout.
iversoncru

Non è eccezionale per i frammenti, poiché stai associando lo "stato nascosto" all'attività che conterrà tutti i tuoi frammenti, il che significa che qualsiasi frammento che desideri visualizzare nell'attività sarà influenzato dalla proprietà (non su un "per frammento "base).
Pelpotronic

11

Se hai un'altra visualizzazione della tua attività come a ListView, puoi anche fare:

ListView.requestFocus(); 

nel tuo onResume () per catturare l'attenzione dal file editText.

So che a questa domanda è stata data una risposta, ma sto solo fornendo una soluzione alternativa che ha funzionato per me :)


5

https://stackoverflow.com/a/11627976/5217837 Questo è quasi corretto:

@Override
public void onCreate(Bundle savedInstanceState) {

getWindow().setSoftInputMode(
   WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

}

Ma dovrebbe essere SOFT_INPUT_STATE_HIDDEN anziché SOFT_INPUT_STATE_ALWAYS_VISIBLE


4

Usa questo nel codice della tua attività:

@Override
public void onCreate(Bundle savedInstanceState) {

getWindow().setSoftInputMode(
   WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

}

Questo non ha funzionato per me: la tastiera è ancora visualizzata quando ho iniziato la mia attività.
David Doria

È possibile controllare questo link, funzionerà: stackoverflow.com/questions/18977187/...
Sujeet Kumar Gupta

3

Ho avuto un problema simile, anche quando si cambiava scheda la tastiera si apriva automaticamente e rimase su, con Android 3.2.1 su un tablet. Usa il metodo seguente:

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 () e onPause () dell'attività per ogni EditText:

setEditTextFocus (myEditText, false);

Per ogni EditText un OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Per ciascuno EditTextin OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

E per ciascuno EditTextin layout xml:

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

Probabilmente c'è più possibilità di ottimizzazione del codice.


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

usando il frammento .. questo codice funziona per nascondere la tastiera ... quando un frammento si apre evita il focus sulla tastiera del campo testo ...
Sreelal S

2

Ho trovato questa semplice soluzione che ha funzionato per me. Imposta questi attributi nel layout genitore:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

E ora, quando l'attività inizia, questo layout principale verrà attivato per impostazione predefinita.

Inoltre, possiamo rimuovere lo stato attivo dalle visualizzazioni figlio in fase di esecuzione dando nuovamente lo stato attivo al layout principale, in questo modo:

findViewById(R.id.mainLayout).requestFocus();

Spero che funzioni per te.


1

questa è la soluzione che sto usando, non è la soluzione migliore ma funziona bene per me

 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

È interessante notare che questa documentazione https://developer.android.com/training/keyboard-input/visibility.html afferma che quando un'attività inizia e il focus è dato a un campo di testo, la tastiera non viene mostrata (e poi va a mostrarti come mostrare la tastiera se vuoi con del codice).

Sul mio Samsung Galaxy S5, è così che funziona la mia app (senza voce manifest o codice specifico): nessuna tastiera virtuale. Tuttavia, su un Lollipop AVD, viene mostrata una tastiera morbida, in violazione del documento sopra riportato.

Se ottieni questo comportamento durante il test in un AVD, potresti voler testare su un dispositivo reale per vedere cosa succede.


1

Questo ha alcune buone risposte nel seguente post: Impedisci a EditText di concentrarsi sull'avvio dell'attività . Quello che uso regolarmente è il seguente codice di 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"/>

NOTA: l'elemento fittizio deve essere POSIZIONATO A DESTRA PRIMA dell'elemento attivabile.

E penso che dovrebbe funzionare perfettamente anche con ScrollView e non ho avuto problemi con l'accessibilità neanche per questo.


0

Ciò si verifica quando il tuo EditText ottiene automaticamente il focus come quando inizia l'attività. Quindi un modo semplice e stabile per risolvere questo problema è semplicemente impostare il focus iniziale su qualsiasi altra vista, come un pulsante, ecc.

Puoi farlo nel tuo layout XML, nessun codice richiesto.


0

La risposta accettata non funziona per me, ecco perché dare una soluzione funzionante alla risposta, potrebbe essere utile!

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

Ora la tastiera è aperta divertiti :)


La domanda era come impedire l'apertura della tastiera.
jk7

0

android: windowSoftInputMode = "stateHidden | AdjustResize"

Funziona bene


0

Aggiungi il codice sottostante all'inizio dell'XML dell'attività e assicurati che la vista sia sopra EditText

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

0

android:focusableInTouchMode="true"

Aggiungi la riga sopra a xml di EditTexto TextInputLayoutche ha lo stato attivo e sta causando ilsoftInputKeyboard apparire il.

Questo ha risolto il problema per noi e ora la tastiera non si apre


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

Questo funziona per me, ragazzi, il frammento potrebbe avere una sintassi diversa. QUESTO FUNZIONA PER L'ATTIVITÀ


È necessario fornire eventuali limitazioni, ipotesi o semplificazioni nella risposta. Vedi i dettagli su come rispondere a questo link: stackoverflow.com/help/how-to-answer
Osama Abdulrehman

-1

Se la tua vista ha EditText e Listview, Tastiera si aprirà per impostazione predefinita. Per nascondere la tastiera che si apre per impostazione predefinita, procedi come segue

this.listView.requestFocus();

Assicurati di richiedere il focus su listview dopo aver ottenuto la visualizzazione per editText.

Per es

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Se lo fai, editText verrà messo a fuoco e apparirà la tastiera.


L'ho fatto ma la tastiera si apre ancora e il focus è con editText.
David Doria
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.