2011-05-15 3 views
24

Je rencontre un problème avec un contrôle EditText. Ce problème se produit uniquement sur cette activité particulière et aucune autre activité avec EditTexts. J'ai supprimé tous les appels setText pour ce EditText et le problème persiste toujours. Je cours Android 2.3.4 sur mon appareil mobile. C'est un Nexus S et stock courant Android. Dans l'émulateur (sous Android 2.2), ce problème ne se produit pas.EditText doubler lors de la rotation

Lorsque je fais pivoter le téléphone, Android remplace automatiquement le texte qui se trouvait dans l'EditText avant la rotation. Je n'utilise pas savedInstanceState pour faire quoi que ce soit. Android le fait lui-même.

Mon problème:

Supposons que le mot "test" est dans le EditText. Lorsque je fais tourner le téléphone, Android place "testtest" dans l'EditText lorsque l'activité est recréée. Ce seulement se produit lorsque j'utilise le clavier virtuel pour taper dans l'EditText, je ne clique pas sur le bouton "terminé" sur le clavier virtuel, je presse pour retirer le clavier virtuel, puis je fais pivoter l'appareil. Si j'utilise le bouton "Terminé" au lieu du bouton Précédent, le problème ne se produit pas.

Des idées? Comme je l'ai dit, je suis pas définissant le texte. Toutes les lignes appelant setText ont été mises en commentaire.

Mise à jour 1: j'ai commenté tout dans cette activité à l'exception de la méthode onCreate(). Problème toujours présent

Mise à jour 2: J'ai créé une nouvelle activité. Cette toute nouvelle activité a seulement une méthode onCreate(). La seule chose dans la méthode onCreate() est un appel à setContentView (utilise le même fichier layout) et appelle super's onCreate(). Le problème persiste toujours. Je suis perplexe. La seule chose que je peux deviner est qu'il y a quelque chose de bizarre avec le fichier de mise en page. Je n'ai aucune idée de ce que ce serait.

Mise à jour 3: J'ai tout retiré de la mise en page à l'exception de l'EditText. Problème toujours présent

+0

qu'en est-il de editText.append()? Utilisez-vous une telle chose? si c'est le cas, vous devriez peut-être les désactiver aussi – dds

+0

Si vous voulez stocker le contenu EditText au cours d'une modification de configuration, j'utilise [onRetainNonConfigurationInstance] (http://developer.android.com/reference/android/app/Activity.html# onRetainNonConfigurationInstance% 28% 29) jusqu'à présent. Vous pouvez renvoyer votre chaîne de contenu EditText à partir de cette méthode par exemple.Et vous pouvez le récupérer sur votre onCreate en utilisant [getLastNonConfigurationInstance] (http://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance%28%29) qui retourne null s'il n'y a pas de données sauvegardées disponibles. – harism

+0

Avez-vous essayé avec un appareil physique? Mise à jour de votre ADK? Honnêtement, cela ressemble à un bug avec votre émulateur. –

Répondre

-1

Pour gérer la rotation vous change ajoutez votre android:configChanges manifeste:

 <activity 

     android:name="yourActivity" 
     android:configChanges="orientation"></activity> 
+0

J'ai essayé ceci et il remplace toujours le texte sans que je fasse quelque chose. – Andrew

+0

Ne résout pas le problème. – vaughandroid

13

J'ai eu un problème similaire, mais je ne vois quand la saisie semi-automatique est activée pour la EditText. Mon travail autour de était de désactiver la saisie semi-automatique. <EditText . . . android:inputType="textMultiLine|textNoSuggestions" />

+1

Super, cela a fonctionné pour moi. Merci beaucoup. – Ridcully

+3

C'est une merde que ça fonctionne. – MinceMan

+0

Ce bug est toujours présent sur Android 4.0.3, mais ce correctif fonctionne. Mais j'aimerais vraiment pouvoir offrir à mes utilisateurs la saisie semi-automatique ... – JDJ

2

Je suis venu avec une solution de rechange que vous pourriez essayer. Il fonctionne en sous-classant EditText, en attrapant quelques événements et en acceptant seulement les changements de texte qui se produisent lorsque le clavier est affiché, ce qui devrait filtrer toutes les modifications non effectuées par l'utilisateur en tapant quelque chose. Je n'ai toujours aucune idée de ce que cela pourrait causer.

static class CustomEditText extends EditText{ 
    boolean keyboardHidden = true; 
    String mText = null; 
    public CustomEditText(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    public CustomEditText(Context context, AttributeSet attr) { 
     super(context, attr); 
     // TODO Auto-generated constructor stub 
    } 

    //This gets called for any text field change, regardless of where the change comes from 
    //When the phone flips and tries to double the text we can catch it. 
    //If the keyboard is hidden (meaning the user isn't typing anything) the strings should match 
    protected void onTextChanged(CharSequence text, int start, int before, int after){ 

     if(keyboardHidden && mText!=null && !text.toString().equals(mText)){ 
      setText(mText); 
      setSelection(mText.length()); 
     } 
     else 
      mText = text.toString(); 
    } 

    //There's no way right now to directly check if the soft keyboard is displayed 
    //On touch, the soft keyboard is displayed by default for EditText, so assume the keyboard is displayed from this point on 
    public boolean onTouchEvent(MotionEvent event){ 
     keyboardHidden = false; 
     super.onTouchEvent(event); 
     return true; 
    } 

    //On a back press we're removing the soft keyboard so set the flag back to true 
    public boolean dispatchKeyEventPreIme(KeyEvent event){ 
     if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){ 
      keyboardHidden = true; 
     } 
     return super.dispatchKeyEvent(event); 
    } 

} 
+0

Merci - J'aime cette solution! Je veux seulement ajouter que si vous décidez de cacher le clavier sur l'action "Done" par exemple, vous pouvez en même temps définir keyboardHidden = true à nouveau. – Nims

Questions connexes