2010-06-11 14 views
24

Dans edittext, après avoir tapé la touche 'Entrée', le système crée une nouvelle ligne à l'intérieur. Je voudrais me concentrer sur le prochain edittext, pas de nouvelle ligne. comment coder? mon code XML est ci-dessousKeyCode_Entrez au prochain edittext

<EditText 
    android:id="@+id/txtNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblNPCode" 
    android:layout_below="@+id/lblNPCode" 
    android:layout_centerHorizontal="true"/> 
<EditText 
    android:id="@+id/txtCNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblCNPCode" 
    android:layout_below="@+id/lblCNPCode" 
    android:layout_centerHorizontal="true"/> 

Je caputer également le code clé dans setOnKeyListener

tCNPCode.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      // TODO Auto-generated method stub 
      if(keyCode == 66) { 
       Toast.makeText(S_PCode.this, "Enter Key", Toast.LENGTH_LONG).show(); 
       //tNPCode.setFocusable(true); 
      } 
      return false; 
     } 
    }); 

Répondre

12

Vous devez utiliser la méthode requestFocus. Dans votre cas, ce sera quelque chose comme:

tCNPCode.setOnKeyListener(new OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if(keyCode == 66) { 
      txtCNPCode.requestFocus(); 
     } 
     return false; 
    } 
}); 
+1

Merci. J'utilise requestFocus. Ça a marché. besoin d'ajouter retour vrai? – soclose

+3

Je suggère de le filtrer aussi avec ACTION_UP parce que vous frapperez deux fois la méthode onKey et si vous implémentez le setOnKeyListener dans une liste de EditTexts dans une ArrayList , vous risquez de faire deux pas en avant. if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) – jkanini

+0

Je n'utiliserais pas le littéral int réel, car il n'est pas lisible du tout. – styler1972

34

Vous ne devez même pas utiliser OnKeyListener. Ajoutez simplement la ligne android:singleLine="true" à votre EditText. Après cette opération, EditText se comporte exactement comme vous le souhaitez. Ainsi, dans votre cas particulier:

<EditText 
    android:id="@+id/txtNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblNPCode" 
    android:layout_below="@+id/lblNPCode" 
    android:layout_centerHorizontal="true" 
    android:singleLine="true" 
/> 
<EditText 
    android:id="@+id/txtCNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblCNPCode" 
    android:layout_below="@+id/lblCNPCode" 
    android:layout_centerHorizontal="true" 
/> 

résout le problème.

+0

Ceci combiné avec l'action IME était la meilleure option merci –

+0

Merci pour cette explication génial et simple – anetha

+1

Cet id bien, Mais l'android: singleLine = "true" est obsolète. –

9

Le meilleur moyen est d'utiliser l'une des options pour inputType, par exemple: android:inputType="textPersonName" Ceci permettra d'obtenir l'effet recherché. Découvrez les autres options aussi, cela vous fera économiser du temps dans le futur :)

Vous ne devriez pas utiliser android: singleLine = "true", car il est obsolète. Voici ce que les dit à ce sujet documentations:

Cet attribut est dépréciée et est remplacé par le drapeau textMultiLine dans l'attribut inputType. Soyez prudent lorsque vous modifiez les dispositions existantes, car la valeur par défaut de singeLine est false (mode multi-ligne ), mais si vous spécifiez une valeur pour inputType, la valeur par défaut est mode ligne unique. (Si les attributs singleLine et inputType sont , les indicateurs inputType remplacent la valeur de singleLine.).

6

relatifs aux options, bonne description ÉMI ici http://androidcookbook.com/Recipe.seam;jsessionid=C824437B48F346E23FBE5828969029B4?recipeId=422 et la documentation ici http://developer.android.com/reference/android/widget/TextView.html#attr_android:imeOptions. La seule chose dont vous avez besoin est d'ajouter un attribut android: imeOptions = "actionNext" sur chaque EditText. Keyboard apparaît avec une touche Next où Enter était utilisé et permet de naviguer jusqu'au prochain EditText.

Mais l'ordre de "actionNext" est de haut en bas. Par exemple, si vous disposez d'une disposition horizontale:

<LinearLayout android:orientation="horizontal" > 
     <EditText android:id="@+id/et1" android:imeOptions="actionNext" /> 
     <EditText android:id="@+id/et2" android:imeOptions="actionNext" /> 
</LinearLayout> 

et2 jamais obtenir le focus. Vous devez fixer dans le code:

et1.setOnEditorActionListener(new OnEditorActionListener() 
{ 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, 
      KeyEvent event) 
    { 
     switch (actionId) 
     { 
     case EditorInfo.IME_ACTION_NEXT: 
      boolean result = false; 
      TextView v1 = (TextView) v.focusSearch(View.FOCUS_RIGHT); 
      if (v1 != null) 
       result = v1.requestFocus(View.FOCUS_RIGHT); 
      else if (!result) 
      { 
       v1 = (TextView) v.focusSearch(View.FOCUS_DOWN); 
       if (v1 != null) 
        result = v1.requestFocus(View.FOCUS_DOWN); 
      } 
      if (!result) 
       v.onEditorAction(actionId); 
      break; 

     default: 
      v.onEditorAction(actionId); 
      break; 
     } 
     return true; 
    } 
}); 

lien d'origine: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/OykOG6XtE8w

1

situé à seulement le nombre maximal de la ligne à la boîte EditText dans le fichier de mise en page xml: android:maxLength="1"