2012-09-10 13 views
7

Tengo un diseño que tiene un Editar Texto y un Botón. I <include> en mi diseño principal.Diseño que se duplica en la rotación de la pantalla

Tengo un problema extraño con el diseño y la rotación. Parece duplicarse cuando el dispositivo (físico) se gira, arruinando el texto y el diseño.

Aquí está en abrir por primera vez, después de añadir un poco de garble extra:

1

DSC_0013 está en el EditarTexto en el lanzamiento del fragmento.

Luego, gire el teléfono y añadir un poco diferente garble:

2

y se puede ver el tema con bastante claridad. Al principio, pensé que solo estaba estropeando EditText. Pero si añado suficiente texto para hacer una nueva línea:

3

puedo ver que el botón se cometa un error también.

Sobreescribo onSaveInstanceState, pero en él no toco el EditText o su valor, se usa estrictamente para otra cosa.

¿Qué está pasando y cómo lo soluciono?

+0

¿Cómo se configura la vista? 'setContentView' + XML? 'addView' exclusivamente? – Eric

Respuesta

13

¡Se arregló!

Resulta que no era la vista que se duplica, ni EditText, ni el Botón. Fue todo el fragmento.

En onCreate de mi actividad, agrego el fragmento a un diseño xml:

private FileDetails fileDetailsFragment; 

public void onCreate(Bundle savedInstanceState) { 
     ... 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fileDetailsFragment = new FileDetails(fileData); 
     fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
     fragmentTransaction.commit(); 

Y onCreate estaba siendo llamado cada vez que gira el teléfono (como se supone que debe). Entonces compruebo si la actividad se está ejecutando por primera vez y funciona muy bien.

private FileDetails fileDetailsFragment; 

public void onCreate(Bundle savedInstanceState) { 
    ... 
    if (savedInstanceState == null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fileDetailsFragment = new FileDetails(fileData); 
     fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
     fragmentTransaction.commit(); 
    } else { 
     fileDetailsFragment = (FileDetails) getSupportFragmentManager().findFragmentById(R.id.DetailsHolder); 
    } 
+4

Más de un año después y esta solución me ayudó :) ¡Muchas gracias por publicar esto! –

+0

Ahora más de tres años ^^ – 8m47x

+0

Aún muy útil respuesta – user1111527

1

Puede también setRetainedInstance (verdadero) en su fragmento, a continuación, tratar de conseguir la forma Fragmento de FragmentManager.findFragmentById (int) o FragmentManager.findFragmentByTag (cadena), y si se devuelve un valor nulo que significaba que había que crea una nueva instancia de tu Fragmento.

private FileDetails fileDetailsFragment; 


public void onCreate(Bundle savedInstanceState) { 
... 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fileDetailsFragment = (FileDetails) getSupportFragmentManager().findFragmentById(R.id.DetailsHolder); 
    if (fileDetailsFragment == null) { 
     fileDetailsFragment = new FileDetails(FileData); 
    } 

    FragmentTransaction fragmentTransaction = fragmentManager 
      .beginTransaction(); 

    fragmentTransaction.add(R.id.DetailsHolder, fileDetailsFragment); 
    fragmentTransaction.commit(); 
} 
Cuestiones relacionadas