Come impostare lo stato attivo su una vista quando viene creato e visualizzato un layout?


90

Attualmente, ho un layout che contiene a Button, a TextViewe un file EditText. Quando viene visualizzato il layout, lo stato attivo verrà automaticamente posizionato su EditText, il che attiverà la visualizzazione della tastiera sul telefono Android. Non è quello che voglio. C'è un modo per impostare il focus su TextViewo su nulla quando viene visualizzato un layout?

Risposte:


109

Imposta lo stato attivo: il framework gestirà lo spostamento dello stato attivo in risposta all'input dell'utente. Per forzare il focus su una vista specifica, chiama requestFocus ()


17

Funziona:

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

Che cosa fa? Sembra che stia modificando uno stato per l'intera attività, e non solo una vista o un frammento, quindi sarei cauto al riguardo e non lo userei a meno che non capisca tutte le sue implicazioni.
Vaddadi Kartick

In effetti, non lo farei sulla base della richiesta del poster originale. Questo potrebbe risolvere il problema attuale, ma il suo utilizzo ha effetti collaterali che potrebbero causare problemi in seguito. Sono hack come questo che si fanno strada nelle basi di codice che fanno sì che altri hack vengano aggiunti in seguito per negare l'hack originale .. il circolo vizioso continua ... e le persone si chiedono perché il codice diventi impossibile da mantenere. Sì, hai indovinato ... Lavoro con altri che fanno cose del genere e mi rendono la vita molto difficile.
dell116

6

Dovresti aggiungere questo:

android:focusableInTouchMode="true"

6

Impostato

 android:focusable="true"

nel tuo <EditText/>


6

Per impostare lo stato attivo, ritardare requestFocus () utilizzando un gestore.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

Puoi provare a nascondere la tastiera. Qualcosa come questo:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

3

Provare

comp.requestFocusInWindow();

3

Imposta anche queste righe su OnResumee assicurati che focusableInTouchsia impostato su true mentre inizializzi i controlli

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

per cambiare il focus rendi il textView in xml attivabile

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

e in Java in creare

textView.requestFocus();

o semplicemente nascondere la tastiera

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android: focusable = "true" e textView.requestFocus (); ha funzionato per me. Grazie!
Werner

2

Nessuna delle risposte precedenti funziona per me. L'unica (diciamo) soluzione è stata quella di cambiare il primo TextView in un EditText disabilitato che riceve il focus e quindi aggiunge

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

nella richiamata onCreate per impedire la visualizzazione della tastiera. Ora il mio primo EditText sembra un TextView ma può ottenere lo stato attivo iniziale, finalmente.


2

L'ultimo suggerimento è la soluzione corretta. Giusto per ripetere, prima impostalo android:focusable="true"nel xmlfile di layout , poi requestFocus()sulla vista nel tuo codice.


1

Penso che una visualizzazione di testo non sia attivabile. Ad esempio, prova a impostare lo stato attivo su un pulsante o a impostare la proprietà focusable su true.


1

puoi aggiungere un testo di modifica di dimensione "0 dip" come primo controllo in ur xml, in modo che si concentrerà sul rendering. (assicurati che sia attivabile e tutto ...)


1

Puoi iniziare aggiungendo android:windowSoftInputModealla tua attività in AndroidManifest.xmlfile.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

In questo modo la tastiera non verrà visualizzata, ma EditTextsarà comunque attiva. Per risolverlo, puoi impostare android:focusableInTouchmodee android:focusablesu truenella tua vista root.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

Il codice sopra farà in modo che RelativeLayoutvenga messo a fuoco invece diEditText


0

L'obiettivo è selezionare i componenti dell'interfaccia utente quando si utilizza qualcosa oltre al tocco (ad esempio, un tasto direzionale, una tastiera, ecc.). Qualsiasi visualizzazione può ricevere lo stato attivo, sebbene alcuni non siano attivabili per impostazione predefinita. (Puoi rendere una vista focalizzabile con setFocusable(true)e forzarne la messa a fuoco conrequestFocus() .)

Tuttavia, è importante notare che quando si è in modalità touch, la messa a fuoco è disabilitata . Quindi, se stai usando le dita, cambiare lo stato attivo a livello di codice non fa nulla. L'eccezione è per le viste che ricevono input da un editor di input. Un EditTextè un tale esempio. Per questa situazione speciale setFocusableInTouchMode(true)viene utilizzato per far sapere alla tastiera virtuale dove inviare l'input. An EditTextha questa impostazione per impostazione predefinita. La tastiera virtuale si aprirà automaticamente.

Se non vuoi che la tastiera morbida appaia automaticamente, puoi sopprimerla temporaneamente come ha notato @abeljus:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Quando un utente fa clic su EditText, dovrebbe comunque mostrare la tastiera.

Ulteriore lettura:


Questa risposta è sbagliata? Nessun commento è stato lasciato con il voto negativo.
Suragch
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.