2011-05-15 23 views
24

Tengo un problema con un control EditText. Este problema solo ocurre en esta actividad en particular y no en otras actividades con EditTexts. He eliminado todas las llamadas a setText para este EditText y el problema aún persiste.EditText doblar al rotar

Estoy ejecutando Android 2.3.4 en mi dispositivo móvil. Es un Nexus S y ejecuta stock de Android. En el emulador (con Android 2.2) este problema no ocurre.

Cuando giro el teléfono, Android reemplaza automáticamente el texto que estaba en EditText antes de la rotación. No estoy usando savedInstanceState para hacer nada. Android está haciendo esto por sí mismo.

Mi problema:

Supongamos que la palabra "prueba" está en el EditarTexto. Cuando gire el teléfono, Android colocará "testtest" en EditText cuando se vuelva a crear la actividad. Este solo ocurre cuando uso el teclado virtual para escribir en EditText, no hago clic en el botón "done" en el teclado virtual, presiono hacia atrás para quitar el teclado virtual, y luego giro el dispositivo. Si utilizo el botón "listo" en lugar del botón Atrás, el problema no ocurre.

¿Alguna idea? Como dije, estoy NO configurando el texto. Todas las líneas que llaman setText han sido comentadas.

Actualización 1: He comentado todo en esta actividad excepto el método onCreate(). El problema sigue ocurriendo.

Actualización 2: He creado una nueva actividad. Esta nueva actividad tiene solo un método onCreate(). Lo único en el método onCreate() es una llamada a setContentView (usa el mismo archivo de diseño) y llama a super's onCreate(). El problema aún persiste. Estoy perplejo. Lo único que puedo adivinar es que hay algo extraño con el archivo de diseño. No tengo idea de lo que sería eso.

Actualización 3: He eliminado todo el diseño, excepto EditText. El problema sigue ocurriendo.

+0

¿qué ocurre con editText.append()? usas tal cosa? si es así, quizás también deba deshabilitarlos – dds

+0

Si desea almacenar el contenido de EditText sobre el cambio de configuración, he estado usando [onRetainNonConfigurationInstance] (http://developer.android.com/reference/android/app/Activity.html# onRetainNonConfigurationInstance% 28% 29) exitosamente hasta el momento. Puede devolver su cadena de contenido EditText de este método, por ejemplo.Y puede recuperarlo en su onCreate usando [getLastNonConfigurationInstance] (http://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance%28%29) que devuelve nulo si no hay datos guardados disponibles. – harism

+0

¿Has probado con un dispositivo físico? ¿Has actualizado tu ADK? Honestamente, suena como un error con tu emulador. –

Respuesta

-1

Para manejar la rotación cambia a sí mismo añadir su manifiesta android:configChanges:

 <activity 

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

Intenté esto y aún reemplaza el texto sin que yo haga nada. – Andrew

+0

No soluciona el problema. – vaughandroid

13

que tenía un problema similar, pero sólo veo que cuando el Autocompletar está activada para la EditarTexto.

Mi trabajo fue desactivar la función de autocompletar. <EditText . . . android:inputType="textMultiLine|textNoSuggestions" />

+1

Genial, esto funcionó para mí. Muchas gracias. – Ridcully

+3

Es una mierda que esto funcione. – MinceMan

+0

Este error todavía está presente en Android 4.0.3, pero esta corrección funciona. Pero me gustaría poder ofrecer a mis usuarios autocompletar ... – JDJ

2

Se me ocurrió una solución que podría intentar. Funciona mediante la creación de subclases de EditText, la captura de un par de eventos y luego solo acepta los cambios de texto que se producen cuando se muestra el teclado, lo que debe filtrar los cambios que el usuario no haya realizado al escribir algo. Todavía no tengo idea de qué podría estar causando esto.

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

Gracias - ¡Me gusta esta solución! Solo quiero agregar que si decides ocultar el teclado en la acción "Listo", por ejemplo, puedes al mismo tiempo establecer keyboardHidden = true nuevamente. – Nims