Comment définir le focus sur une vue lorsqu'une mise en page est créée et affichée?

90

Actuellement, j'ai une mise en page qui contient un Button, un TextViewet un EditText. Lorsque la mise en page est affichée, le focus sera automatiquement mis sur le EditText, ce qui déclenchera l' affichage du clavier sur le téléphone Android. Ce n'est pas ce que je veux. Existe-t-il un moyen de définir le focus sur TextViewou sur rien lorsqu'une mise en page est affichée?

user256239
la source

Réponses:

109

Définir le focus: le cadre gère le déplacement du focus en réponse à l'entrée de l'utilisateur. Pour forcer le focus sur une vue spécifique, appelez requestFocus ()

Marque B
la source
17

Cela marche:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Charles Mosndup
la source
Qu'est ce que ça fait? Il semble que cela modifie un état pour l'ensemble de l'activité, et pas seulement une vue ou un fragment, donc je serais prudent à ce sujet et ne l'utiliserais que si je comprends toutes ses implications.
Vaddadi Kartick
En effet, je ne ferais pas cela sur la base de la demande de l'affiche originale. Cela peut résoudre le problème actuel, mais son utilisation a des effets secondaires qui pourraient causer des problèmes plus tard. Ce sont des hacks comme celui-ci qui se frayent un chemin dans les bases de code qui provoquent l'ajout d'autres hacks plus tard pour annuler le hack original ... le cercle vicieux continue ... et les gens se demandent pourquoi le code devient impossible à maintenir. Oui, vous l'avez deviné ... Je travaille avec d'autres qui font des trucs comme ça et ça me rend la vie très difficile.
dell116
6

Vous devez ajouter ceci:

android:focusableInTouchMode="true"
arif jusoh
la source
6

Ensemble

 android:focusable="true"

dans votre <EditText/>

ravi
la source
6

Pour définir le focus, retardez le requestFocus () à l'aide d'un Handler.

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();
          } 
       }
     );
   }
}
Dan McNerthney
la source
5

Vous pouvez simplement essayer de cacher le clavier. Quelque chose comme ça:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Abeljus
la source
3

Essayer

comp.requestFocusInWindow();
JARC
la source
3

Définissez également ces lignes sur OnResumeet assurez-vous que si focusableInTouchest défini sur true lorsque vous initialisez vos contrôles

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
Pawan Maheshwari
la source
3

pour changer le focus, rendre le textView au format xml focalisable

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

et en java dans sur create

textView.requestFocus();

ou cachez simplement le clavier

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}
Mina Shaker
la source
android: focusable = "true" et textView.requestFocus (); travaillé pour moi. Merci!
Werner
2

Aucune des réponses ci-dessus ne fonctionne pour moi. La seule solution (disons) a été de changer le premier TextView dans un désactivé EditText qui reçoit le focus, puis d'ajouter

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

dans le rappel onCreate pour empêcher l' affichage du clavier. Maintenant, mon premier EditText ressemble à un TextView mais peut enfin obtenir le focus initial.

Lorenzoff
la source
2

La dernière suggestion est la bonne solution. Pour répéter, définissez d'abord android:focusable="true"dans le xmlfichier de mise en page , puis requestFocus()sur la vue dans votre code.

Reza Nezami
la source
1

je pense qu'une vue de texte n'est pas focalisable. Essayez de définir le focus sur un bouton, par exemple, ou de définir la propriété focusable sur true.

lapakrette
la source
1

vous pouvez ajouter un texte d'édition de taille "0 dip" comme premier contrôle dans ur xml, donc, cela obtiendra le focus sur le rendu. (assurez-vous qu'il est focalisable et tout ...)

con_9
la source
1

Vous pouvez commencer par ajouter android:windowSoftInputModeà votre activité dans le AndroidManifest.xmlfichier.

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

Cela empêchera le clavier de s'afficher, mais il aura EditTexttoujours le focus. Pour résoudre ce problème, vous pouvez définir android:focusableInTouchmodeet android:focusableactiver truesur votre vue racine.

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

Le code ci-dessus s'assurera que RelativeLayoutle focus est mis au point au lieu deEditText

Uilque Messias
la source
0

L'accent est mis sur la sélection des composants de l'interface utilisateur lorsque vous utilisez autre chose que le toucher (c'est-à-dire un d-pad, un clavier, etc.). Toute vue peut recevoir le focus, bien que certaines ne soient pas focalisables par défaut. (Vous pouvez rendre une vue focalisable avec setFocusable(true)et la forcer à être focalisée avecrequestFocus() .)

Cependant, il est important de noter que lorsque vous êtes en mode tactile, la mise au point est désactivée . Donc, si vous utilisez vos doigts, changer la mise au point par programme ne fait rien. L'exception à cela concerne les vues qui reçoivent des entrées d'un éditeur d'entrée. Un EditTextest un tel exemple. Pour cette situation particulière, il setFocusableInTouchMode(true)est utilisé pour indiquer au clavier virtuel où envoyer l'entrée. UneEditText a ce paramètre par défaut. Le clavier virtuel apparaîtra automatiquement.

Si vous ne voulez pas que le clavier virtuel apparaisse automatiquement, vous pouvez le supprimer temporairement comme @abeljus l'a noté:

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

Lorsqu'un utilisateur clique sur le EditText, il doit toujours afficher le clavier.

Lectures complémentaires:

Suragch
la source
Cette réponse est-elle fausse? Aucun commentaire n'a été laissé avec le vote défavorable.
Suragch