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?
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?
Risposte:
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 ScrollView
quindi è necessario aggiungere questi attributi al figlio principale di ScrollView
.
Puoi aggiungerlo alla tua attività Manifest di Android:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
Ho diverse implementazioni descritte qui, ma ora ho aggiunto nella AndroidManifest.xml
mia Activity
proprietà:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " La tastiera virtuale è sempre nascosta quando la finestra principale dell'attività ha il focus di input.
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 :)
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
Usa questo nel codice della tua attività:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
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 EditText
in OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
E per ciascuno EditText
in layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Probabilmente c'è più possibilità di ottimizzazione del codice.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
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.
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;
}});
È 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.
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.
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.
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 :)
android: windowSoftInputMode = "stateHidden | AdjustResize"
Funziona bene
android:focusableInTouchMode="true"
Aggiungi la riga sopra a xml di EditText
o TextInputLayout
che ha lo stato attivo e sta causando ilsoftInputKeyboard
apparire il.
Questo ha risolto il problema per noi e ora la tastiera non si apre
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À
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.