2012-09-10 3 views
7

Ho un layout con un EditText e un pulsante. I <include> nel mio layout principale.Layout che si duplica automaticamente sulla rotazione dello schermo

Ho un problema strano con il layout e la rotazione. Sembra duplicarsi quando il dispositivo (fisico) viene ruotato, facendo confusione con il testo e il layout.

Qui è in prima aperto, dopo aggiungo qualche garble in più:

1

DSC_0013 è nel EditText sul lancio del frammento.

Poi, ho ruotare il telefono e aggiungere un po 'diverso garble:

2

e si può vedere il problema abbastanza chiaramente. All'inizio pensavo che fosse solo il EditText a rovinare. Ma se posso aggiungere testo sufficiente per fare una nuova linea:

3

posso vedere che il pulsante viene incasinato troppo.

I override onSaveInstanceState, ma in esso non tocchi l'EditText o il suo valore, è strettamente utilizzato per qualcos'altro.

Cosa sta succedendo e come lo risolvo?

+0

Come si imposta la visualizzazione? 'setContentView' + XML? 'addView' in esclusiva? – Eric

risposta

13

Risolto il problema!

Risulta che non era la vista che si duplicava, o il Modifica testo o il pulsante. Era l'intero frammento.

In di onCreate mia attività, ho aggiungere il frammento di un layout 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(); 

E onCreate era stato chiamato ogni volta che ho ruotato il telefono (come è destinata a). Così ho messo un controllo per vedere se l'attività è stata eseguita per la prima volta, e funziona benissimo.

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

Più di un anno dopo e questa soluzione mi ha aiutato molto :) Grazie mille per aver postato questo! –

+0

Ora oltre tre anni ^^ – 8m47x

+0

Risposta ancora molto utile – user1111527

1

È possibile anche setRetainedInstance (vero) sul frammento, quindi provare a ottenere la forma Fragment de FragmentManager.findFragmentById (int) o FragmentManager.findFragmentByTag (String), e se si restituisce null significava dovevi crea una nuova istanza del tuo frammento.

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