web-dev-qa-db-fra.com

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

Actuellement, j'ai une mise en page qui contient un Button, un TextView et un EditText. Lorsque la mise en page est affichée, le focus est automatiquement placé sur le EditText, ce qui déclenche l'affichage du clavier sur le téléphone Android. Ce n'est pas ce que je veux. y-a-t-il moyen de mettre le focus sur TextView ou sur rien lorsqu'une mise en page est affichée?

89
user256239

Définir le focus: Le framework gérera le déplacement du focus en réponse aux commentaires de l'utilisateur. Pour forcer le focus sur une vue spécifique, appelez requestFocus ()

102
Mark B

Cela marche:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
18
Charles Mosndup

Vous pouvez 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);
5
abeljus

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

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
Dan McNerthney

Vous devriez ajouter ceci:

Android:focusableInTouchMode="true"
4
arif jusoh

Ensemble

 Android:focusable="true"

dans votre <EditText/>

4
ravi

Essayer

comp.requestFocusInWindow();
3
JARC

Définissez également ces lignes sur OnResume et assurez-vous que si focusableInTouch est défini sur true lors de l'initialisation de vos contrôles

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
3
Pawan Maheshwari

changer le focus rendre le textView in xml focusable

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

et dans Java dans le créer

textView.requestFocus();

ou simplement cacher 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);
}
2
Mina Shaker

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 et ensuite ajouter

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

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

2
lorenzoff

La dernière suggestion est la bonne solution. Juste pour répéter, commencez par définir Android:focusable="true" Dans le fichier de présentation xml, puis par requestFocus() sur la vue dans votre code.

1
Reza Nezami

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.

1
lapakrette

Vous pouvez commencer par ajouter Android:windowSoftInputMode à votre activité dans AndroidManifest.xml fichier.

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

Cela fera que le clavier ne se montrera pas, mais EditText sera toujours actif. Pour résoudre ce problème, vous pouvez définir Android:focusableInTouchmode et Android:focusable to true sur votre vue racine.

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

Le code ci-dessus vous assurera que RelativeLayout obtient le focus au lieu de EditText

1
Uilque Messias

Définissez Android:focusable="true" Dans le fichier XML de mise en page, puis requestFocus() dans l'affichage dans votre code

NON, ça ne marche pas ici.

1
Charles Mosndup

vous pouvez ajouter un texte d'édition de taille "0 dip" en tant que premier contrôle de votre code xml, donc, le rendu sera actif (assurez-vous que sa mise au point et tout le reste ...)

1
con_9

Le focus sert à sélectionner des composants de l'interface utilisateur lorsque vous utilisez autre chose que le toucher (par exemple, un pavé tactile, un clavier, etc.). Toute vue peut recevoir le focus, même si certains ne le sont pas par défaut. (Vous pouvez rendre une vue mise au point avec setFocusable(true) et la forcer à la mettre au point avec requestFocus().)

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 programmation ne fait rien. L'exception à cette règle concerne les vues qui reçoivent une entrée d'un éditeur d'entrée. Un EditText en est un exemple. Pour cette situation particulière, setFocusableInTouchMode(true) permet au clavier logiciel de savoir où envoyer les données. Un EditText a ce paramètre par défaut. Le clavier logiciel apparaîtra automatiquement.

Si vous ne voulez pas que le clavier logiciel 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 EditText, il doit quand même afficher le clavier.

Lectures complémentaires:

0
Suragch