android null android-edittext gettext

android - EditText.getText(). ToString() a veces devuelve ""



null android-edittext (10)

Obtengo el texto de EditText y su longitud en el método onTextChanged() de TextWatcher .
Funciona bien cuando getText() para agregar caracteres, pero al eliminar caracteres del texto getText() da vacío incluso si el texto no está vacío. Esto ocurre al azar y no cada vez que elimino personajes. He observado que esto sucede principalmente cuando hay 3-4 caracteres en el texto y presiono el retroceso.

Lo extraño es que este problema solo ocurre en el dispositivo, no en el emulador.

Archivo de diseño:

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

Código:

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()); } });

Nota: Intenté usar los afterTextChanged() y beforeTextChanged() . Pero eso no resolvió el problema.


¿Qué es fromLocation? Deberías usar CharSequence como a continuación.

Prueba esto......

@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()); }


Bien, aquí está la solución, en lugar de obtener el texto usando getText, simplemente convierta la charSequence pasada al

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

devolución de llamada utilizando s.toString()

Mi clase de muestra se ve así

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()); } }); } }


Esto podría ser lo que necesitas. Este es un código que utilicé en un proyecto para buscar cadenas. Tengo un método llamado mySearchMethod, no te preocupes por eso. Pero obtengo mi cadena de texto de edición en el método después de que el texto haya cambiado.

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); }

Llame al método search () en su on create para inicializarlo.


Estoy actualizando otro valor Second EditText basado en la entrada del usuario en First EditText y viceversa.

Por lo tanto, para First EditText he agregado TextWatche como a continuación, que nunca se cuelga y nunca caigo en ningún error o excepción. Puedes probar algo así.

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) { } });

Espero que esto te ayude. Por favor, avíseme si las liendres no lo ayudan.

Disfruta Codificando .... :)


Intente utilizar los caracteres de la secuencia de caracteres de onTextChange () que deben ser los mismos que devuelve fromLocation.getText ().


No veo ningún problema El texto de from_location debe cambiar y lo hace.

¿Por qué estás "revisando" EditText ( from_location ) mientras estás dentro del código de TextWatcher ? No creo que el valor de EditText tenga que ser "estable" mientras está cambiando.

Tal vez lo que sucede es que cuando se verifica que CharSequence en from_location se está actualizando y, a veces, se from_location justo en el medio de un cambio, a veces después.

¿ (CharSequence s, int start, int before, int count) si las (CharSequence s, int start, int before, int count) están devolviendo los valores esperados?

Como veo esta situación. Si desea hacer algún cambio en el texto, debe hacerlo en el argumento String s del método afterTextChanged .

Escribí este código para verificar lo que está sucediendo mientras cambio el contenido de EditText , tal vez sea de cualquier

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 comprueba el código fuente de EditText , puede ver que hereda el método TextView de TextView y devuelve el CharSequence mText la CharSequence mText . Puede sembrar que otra CharSequence mTransformed está definida. Y que en el enorme método setText hay un momento en que mText es reemplazado por mTransformed . Probablemente cuando llamas from_location '' from_location '' de getText y la segunda vez que lo haces después de setText pateado y obtienes mTransformed como respuesta.

Si quieres comprobar esto solo cambia

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


Prueba esto, funcionará ...

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()); } });


Si estaba pasando por el modo de depuración, tenga en cuenta que tiene dos lugares donde almacena valores. En mi caso, EditText tenía mText (Spannable String Builder) y su subcampo (también mText) es el que tiene ID. El creador de cadenas interactivo devolverá el valor de .toString (). El otro devolverá el valor de .getText ().


yo tuve el mismo problema Mi código funcionó bien en la mayoría de los dispositivos, pero en el Motorola Razr i con Android 4.1.2 devolvió al azar una cadena vacía.

Hice la siguiente solución:

// 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) { }

Aunque no sabía por qué ocurrió el problema, publicarlo en un Runnable (posiblemente retrasado) lo solucionó. Y no afectó el comportamiento en los otros dispositivos.

En su caso, es probable que tenga que hacer algunos extra! = Null comprueba para fromLocation - en mi caso nunca es nulo.


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) { }