2012-09-10 12 views
7

Ich habe ein Layout, das einen EditText und einen Button hat. I <include> es in meinem Hauptlayout.Layout, das sich selbst auf Bildschirmrotation dupliziert

Ich habe ein seltsames Problem mit dem Layout und der Rotation. Es scheint sich zu duplizieren, wenn das Gerät (physisch) gedreht wird, was den Text und das Layout durcheinander bringt.

Hier ist es auf dem ersten offen, nachdem er einige zusätzliche garble hinzu:

1

DSC_0013 im EditText ist beim Start des Fragments.

Dann drehe ich das Telefon und fügen Sie einige andere verstümmeln:

2

Und Sie können das Problem ziemlich deutlich sehen. Zuerst dachte ich, es wäre nur der EditText. Aber wenn ich genug Text hinzufügen, um eine neue Zeile zu machen:

3

ich sehen kann, dass die Taste zu messed aufsteht.

Ich überschreiben onSaveInstanceState, aber ich nicht den EditText oder seinen Wert berühren, es wird ausschließlich für etwas anderes verwendet.

Was passiert und wie behebe ich es?

+0

Wie stellen Sie die Ansicht ein? 'setContentView' + XML? 'addView' exklusiv? – Eric

Antwort

13

Fehler behoben!

Es stellte sich heraus, dass es nicht die Ansicht war, die sich selbst oder den EditText oder die Schaltfläche dupliziert. Es war das gesamte Fragment.

In meinen Aktivitäten onCreate, füge ich das Fragment in ein XML-Layout:

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

Und onCreate wurde ich das Telefon gedreht jedes Mal aufgerufen wird (wie es gemeint ist). Also überprüfte ich, ob die Aktivität zum ersten Mal ausgeführt wird, und es funktioniert großartig.

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

Über ein Jahr später und diese Lösung hat mir einfach geholfen :) Vielen Dank für das Posten! –

+0

Jetzt über drei Jahre ^^ – 8m47x

+0

Noch sehr nützliche Antwort – user1111527

1

Sie können auch setRetainedInstance (true) auf dem Fragment, dann versuchen, das Fragment Form de FragmentManager.findFragmentById (int) oder FragmentManager.findFragmentByTag (String) zu bekommen, und wenn es null zurück gemeint, man musste Erstelle eine neue Instanz deines Fragments.

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