Domanda Interrompe EditText dalla messa a fuoco all'avvio dell'attività
ho un Activity
in Android, con due elementi:
EditText
ListView
Quando il mio Activity
inizia, il EditText
ha immediatamente il focus di input (cursore lampeggiante). Non voglio che nessun controllo abbia il focus di input all'avvio. Provai:
EditText.setSelected(false);
Senza fortuna. Come posso convincere il EditText
non selezionare se stesso quando il Activity
inizia?
2386
2017-10-12 15:03
origine
risposte:
Ottima risposta da Luc e Mark, tuttavia manca un buon esempio di codice. Aggiungere il tag android:focusableInTouchMode="true"
a <LinearLayout>
come il seguente esempio risolverà il problema.
<!-- 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"/>
2024
2017-11-02 15:49
Il vero problema è che non vuoi che si concentri? O non vuoi che mostri la tastiera virtuale come risultato della messa a fuoco del EditText
? Non vedo davvero un problema con il EditText
avendo l'attenzione su start, ma è sicuramente un problema avere la finestra softInput aperta quando l'utente non ha richiesto esplicitamente di focalizzare EditText
(e aprire la tastiera come risultato).
Se è il problema della tastiera virtuale, vedi il AndroidManifest.xml
<attività> elemento documentazione.
android:windowSoftInputMode="stateHidden"
- nascondilo sempre quando entri nell'attività.
o android:windowSoftInputMode="stateUnchanged"
- non cambiarlo (ad esempio non farlo mostrare se non è già mostrato, ma se era aperto quando si entra nell'attività, lasciarlo aperto).
1565
2018-04-09 21:22
Esiste una soluzione più semplice. Imposta questi attributi nel tuo 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 otterrà il focus di default.
Inoltre, possiamo rimuovere lo stato attivo dalle viste secondarie in fase di esecuzione (ad es. Dopo aver terminato la modifica dei bambini) dando di nuovo il focus al layout principale, in questo modo:
findViewById(R.id.mainLayout).requestFocus();
Buon commento a partire dal Guillaume Perrot:
android:descendantFocusability="beforeDescendants"
sembra essere il
predefinito (il valore intero è 0). Funziona solo aggiungendo
android:focusableInTouchMode="true"
.
Davvero, possiamo vedere che il beforeDescendants
impostato come predefinito nel ViewGroup.initViewGroup()
metodo (Android 2.2.2). Ma non uguale a 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Grazie a Guillaume.
1012
2017-12-26 23:35
L'unica soluzione che ho trovato è:
- Creare un LinearLayout (Non so se altri tipi di Layout funzioneranno)
- Imposta gli attributi
android:focusable="true"
e android:focusableInTouchMode="true"
E il EditText
non otterrà lo stato attivo dopo aver avviato l'attività
384
2017-10-23 08:12
Il problema sembra provenire da una proprietà che posso vedere solo in XML form
del layout.
Assicurati di rimuovere questa riga alla fine della dichiarazione all'interno di EditText
Tag XML:
<requestFocus />
Questo dovrebbe dare qualcosa del genere:
<EditText
android:id="@+id/emailField"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress">
//<requestFocus /> /* <-- without this line */
</EditText>
67
2018-03-13 09:57
utilizzando le informazioni fornite da altri poster, ho utilizzato la seguente soluzione:
nel layout XML
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
android:id="@+id/linearLayout_focus"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
android:id="@+id/autocomplete"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:inputType="textNoSuggestions|textVisiblePassword"/>
in onCreate ()
private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
//get references to UI components
mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}
e infine, in onResume ()
@Override
protected void onResume() {
super.onResume();
//do not give the editbox focus automatically when activity starts
mAutoCompleteTextView.clearFocus();
mLinearLayout.requestFocus();
}
63
2018-05-26 21:07
Quanto segue impedirà a edittext di mettere a fuoco quando viene creato, ma afferralo quando lo tocchi.
<EditText
android:id="@+id/et_bonus_custom"
android:focusable="false" />
Quindi puoi impostare focusable su false in xml, ma la chiave è in java, a cui aggiungi il seguente listener:
etBonus.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.setFocusable(true);
v.setFocusableInTouchMode(true);
return false;
}
});
Poiché stai tornando falso, cioè non consumando l'evento, il comportamento di messa a fuoco procederà normalmente.
58
2018-06-15 04:45
Provare clearFocus () invece di setSelected(false)
. Ogni vista in Android ha sia focusability e selettività, e penso che tu voglia semplicemente cancellare l'attenzione.
54
2017-10-12 19:02