Domanda Interrompe EditText dalla messa a fuoco all'avvio dell'attività


ho un Activity in Android, con due elementi:

  1. EditText 
  2. 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