EditText.getText (). ToString () retourne parfois ""

Je reçois le texte d'EditText et sa longueur dans la méthode onTextChanged() de TextWatcher .
Il fonctionne bien lorsque je tape pour ajouter des caractères, mais tout en supprimant les caractères du texte getText() donne vide même si le texte n'est pas vide. Cela se produit de façon aléatoire et pas chaque fois que je supprime les caractères. J'ai observé que cela se produit surtout lorsque 3 à 4 caractères sont là dans le texte et j'appuie sur l'arrière-plan.

Une partie étrange est que ce problème se produit uniquement sur le périphérique, et non sur l'émulateur.

  • Créer une bibliothèque Android AAR, y compris javadoc et sources
  • L'application peut faire trop de travail sur son thread principal
  • Comment définir les propriétés par défaut dans une version AOSP?
  • Quelles sont les différences entre FLAG_ACTIVITY_RESET_TASK_IF_NEEDED et FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?
  • Développement d'applications Android: Deux icônes sont créées et j'ai seulement besoin d'une
  • Les fichiers dex multiples définissent le mode / support / annotation / AnimRes
  • Fichier de mise en page:

     <LinearLayout style="@style/create_trip_activity_components_style" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center_vertical" android:orientation="horizontal" > <EditText android:id="@+id/from_location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dp" android:ems="10" android:hint="@string/from_location_hint" android:inputType="text" > <requestFocus /> </EditText> <Button android:id="@+id/use_current_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="right" android:onClick="useCurrentLocation" android:text="@string/use_current" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> 

    Code:

     fromLocation.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (fromLocation == null) { Log.d(TAG, "fromLocation is null................"); } Log.d(TAG, "fromLocation text : " + fromLocation.getText().toString()); Log.d(TAG, "fromLocation text length : " + fromLocation.getText().length()); Log.d(TAG, "S : " + s); Log.d(TAG, "S length : " + s.length()); } }); 

    Remarque: J'ai essayé d'utiliser les afterTextChanged() et beforeTextChanged() . Mais cela n'a pas résolu le problème.

  • Bonne application d'exemple pour le service Android
  • Ignorer le mode Immersive
  • Android Capture d'écran de Surface View Shows Black Screen
  • Android Facebook SDK 4.0.0 Le partage de rappel ne fonctionne pas correctement
  • Android <2.3 et java.text.Normalizer
  • Comment modifier le minSdkVersion d'un projet?
  • 10 Solutions collect form web for “EditText.getText (). ToString () retourne parfois ""”

    Je ne vois aucun problème. Le texte de from_location doit changer et il le fait.

    Pourquoi êtes-vous en train de vérifier le EditText ( from_location ) pendant que vous êtes dans le code TextWatcher . Je ne pense pas que la valeur du EditText doit être "stable" tout en changeant.

    Peut-être que ce qui se passe, c'est que lorsque vous vérifiez que CharSequence à partir de la from_location est en cours de mise à jour et, parfois, vous l'attrapez juste au milieu d'un changement, parfois après.

    Avez-vous vérifié si le (CharSequence s, int start, int before, int count) renvoie les valeurs attendues?

    Comme je vois cette situation. Si vous souhaitez effectuer des modifications sur le texte, vous devez les faire sur l'argument String s de la méthode afterTextChanged .

    J'ai écrit ce code pour vérifier ce qui se passe tout en modifiant le contenu de EditText , peut-être qu'il en soit

      mEdtText.addTextChangedListener(new TextWatcher() { private static final String TAG = "TextWatcher"; private static final boolean DEBUG = true; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (DEBUG) Log.d(TAG, "(onTextChanged) In \"" + s + "\" " + before + " characters " + " are being replaced at " + start + " by " + count + " (" + s.subSequence(start, start + count) + ")"); if (DEBUG) Log.d(TAG, "(onTextChanged) mEdtText: \"" + mEdtText.getText() + "\""); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (DEBUG) Log.d(TAG, "(beforeTextChanged) In \"" + s + "\" " + count + " characters (" + s.subSequence(start, start + count) + ") are about to be replaced at " + start + " by " + after); if (DEBUG) Log.d(TAG, "(beforeTextChanged) mEdtText: \"" + mEdtText.getText() + "\""); } } 

    Si vous cochez le code source de EditText vous pouvez voir que hériter de la méthode TextView de TextView et il renvoie le CharSequence mText . Vous pouvez semer qu'un autre CharSequence mTransformed est défini aussi. Et que dans l'énorme méthode setText , il y a un moment où mText est remplacé par mTransformed . Probablement, lorsque vous appelez de from_location de getText vous getText et la deuxième fois que vous le faites après la mise en service de setText et que vous recevez mTransformed comme réponse.

    Si vous voulez vérifier ce changement juste

     CharSequence cs = from_location.getText(); Log.d(... + cs + ...); // no need to call toString as implicit call. ... Log.d(... + cs.length() + ...); 

    Si vous procédiez au mode débogage, pensez à deux endroits où il stocke les valeurs. Dans mon cas, EditText avait mText (Spannable String Builder) et son sous-champ (également mText) est celui avec ID. Le générateur de chaînes spannable renverra la valeur de .toString (). L'autre renverra la valeur de .getText ().

    Essayez d'utiliser CharSequence s à partir de l'OnTextChange () devrait être identique à celui renvoyé par fromLocation.getText ().

     public void afterTextChanged(Editable s) { if(s.length()>=6) { } else{ } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } 

    C'est peut-être ce dont vous avez besoin. C'est un code que j'ai utilisé sur un projet pour rechercher à travers des chaînes. J'ai une méthode appelée mySearchMethod, ne vous inquiétez pas à ce sujet. Mais je reçois ma chaîne de texte d'édition sur la méthode après le changement de texte ..

      public void search(){ // Notice I used a final edittext final EditText editText = (EditText) findViewById(R.id.search); // create the TextWatcher TextWatcher textWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { String searchQuery = editText.getText().toString(); // This method is just something I did with the string I got MySearchMethod(searchQuery); } }; //we must add the textWatcher to our EditText editText.addTextChangedListener(textWatcher); } 

    Appelez la recherche de méthode () dans votre création pour l'initialiser.

    Qu'est-ce que le fromLocation? Vous devriez utiliser CharSequence s comme ci-dessous.

    Essaye ça……

     @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // if(fromLocation == null) { // Log.e(TAG, "fromLocation is null."); // } Log.e(TAG, "fromLocation text : " + s.toString()); Log.e(TAG, "fromLocation text length : " + s.toString().length()); // Log.e(TAG, "fromLocation id : " + fromLocation.getId()); // Log.e(TAG, "fromLocation text : " + fromLocation.getText().toString()); // Log.e(TAG, "fromLocation text length : " + //fromLocation.getText().toString().length()); } 

    Essayez cela, ça fonctionnera …

     final EditText from_location = (EditText) findViewById(R.id.from_location); from_location.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(from_location == null) { Log.v("", "fromLocation is null."); } Log.v("", "fromLocation id : " + from_location.getId()); Log.v("", "fromLocation text : " + from_location.getText().toString()); Log.v("", "fromLocation text length : " + from_location.getText().toString().length()); } }); 

    Je met à jour une autre valeur de Second EditText en fonction de l'entrée de l'utilisateur sur First EditText et visa-versa.

    Donc, pour First EditText, j'ai ajouté TextWatche comme ci-dessous, qui ne se heurte jamais et ne tombe jamais dans une erreur ou une exception. Vous pouvez essayer quelque chose comme ça.

     final EditText from_location = (EditText) findViewById(R.id.from_location); from_location.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(!(from_location.getText().toString().equals(""))) { Log.e(TAG, "fromLocation id : " + fromLocation.getId()); Log.e(TAG, "fromLocation text : " + fromLocation.getText().toString()); Log.e(TAG, "fromLocation text length : " + fromLocation.getText().toString().length()); }else{ Log.e(TAG, "fromLocation is null."); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void afterTextChanged(Editable s) { } }); 

    J'espère que cela vous aidera. S'il vous plaît laissez-moi savoir si nits ne vous aide pas.

    Profitez du codage …. 🙂

    D'accord Voici la solution, au lieu d'obtenir le texte à l'aide de getText, il suffit de convertir le charSequence passé à la

     onTextChanged(CharSequence s, int start, int before, int count) 

    s.toString() aide de s.toString()

    Ma classe d'exemple ressemble à ceci

     package com.peshal.texttest; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.widget.EditText; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText fromLocation = (EditText) findViewById(R.id.editText1); fromLocation.addTextChangedListener(new TextWatcher(){ @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d("Current String is :" ,s.toString()); } }); } } 

    J'ai eu le même problème. Mon code fonctionne bien sur la plupart des appareils, mais sur Motorola Razr i avec Android 4.1.2, il a retourné au hasard une chaîne vide.

    J'ai fait la solution suivante:

     // TextWatcher Methods @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { fromLocation.post(new Runnable() { @Override public void run() { Editable text = fromLocation.getText(); //... now the string is not empty anymore } }); } @Override public void afterTextChanged(Editable editable) { } 

    Même si je ne savais pas pourquoi le problème était survenu – en l'affichant dans un Runnable (éventuellement retardé), le réparait. Et n'a pas affecté le comportement sur les autres périphériques.

    Dans votre cas, vous devrez probablement faire un supplément! = Des contrôles nuls de FromLocation – dans mon cas, c'est jamais nul.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.