Wenn Sie die Ansichtshierarchie aus dem gespeicherten Zustand wiederherstellen, werden die erweiterten Ansichten nicht wiederhergestellt

Ich versuche, eine Ansichtshierarchie zu speichern und wiederherzustellen, die aus einer Tabelle der Schaltflächen besteht. Die Anzahl der Tabellenzeilen und Schaltflächen, die in der Tabelle benötigt werden, ist bis zur Laufzeit nicht bekannt und wird programmgesteuert zu einem aufgeblasenen XML-Layout in der onCreate(Bundle) -Methode meiner Activity onCreate(Bundle) . Meine Frage ist: Kann die Final Table gespeichert und wiederhergestellt werden, indem du die Standard-View- / Restore-Implementierung von Android verwendet hast?

Ein Beispiel für meinen aktuellen Versuch ist unten. Bei der ersten Ausführung baut die Tabelle wie erwartet auf. Wenn die Aktivität zerstört wird (durch Drehen des Geräts), zeigt die umgebaute Ansicht nur eine leere TableLayout ohne Kinder.

  • Filtern von Beschleunigungsmesser-Datenrauschen
  • OnActivityResult für Fragment
  • Wie kann ich die Kamera-Funktionalität mit zusätzlichen Optionen (wie Panorama) implementieren?
  • Wie gehe ich von Google-Analytics zu Firebase-Analytics?
  • So verwenden Sie benutzerdefinierte Schriftart in Android Studio
  • Zwei verschiedene Layouts für eine Aktivität
  • Die in setContentView(int) referenzierte XML-Datei enthält unter anderem das leere TableLayout , dem die Schaltflächen hinzugefügt werden.

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Setup this activity's view. setContentView(R.layout.game_board); TableLayout table = (TableLayout) findViewById(R.id.table); // If this is the first time building this view, programmatically // add table rows and buttons. if (savedInstanceState == null) { int gridSize = 5; // Create the table elements and add to the table. int uniqueId = 1; for (int i = 0; i < gridSize; i++) { // Create table rows. TableRow row = new TableRow(this); row.setId(uniqueId++); for (int j = 0; j < gridSize; j++) { // Create buttons. Button button = new Button(this); button.setId(uniqueId++); row.addView(button); } // Add row to the table. table.addView(row); } } } 

    Mein Verständnis ist, dass Android den Zustand der Ansichten speichert, solange sie eine ID zugewiesen haben, und sie stellt die Ansichten wieder her, wenn die Aktivität neu erstellt wird, aber im Moment scheint es, das XML-Layout neu zu erstellen und nichts mehr. Beim Debuggen des Codes kann ich bestätigen, dass onSaveInstanceState() auf jeder onRestoreInstanceState(Parcelable) in der Tabelle onRestoreInstanceState(Parcelable) , aber onRestoreInstanceState(Parcelable) ist nicht.

  • Android 2.2 wifi Hotspot API
  • Wie kann ich ein Objekt serialisieren und es in einer Datei in Android speichern?
  • GL Wallpaper Beispiel zeigt nur grünen Bildschirm in Emulator, aber es funktioniert im Gerät
  • Warum das Abrufen von Google-Richtungen für Android mit KML-Daten funktioniert nicht mehr?
  • Drag & Drop in einem `ListView`
  • Wie benutzt man relativelayout.setBackgroundDrawable () mit einer Bitmap?
  • 3 Solutions collect form web for “Wenn Sie die Ansichtshierarchie aus dem gespeicherten Zustand wiederherstellen, werden die erweiterten Ansichten nicht wiederhergestellt”

    Nach dem Durchsuchen des Quellcodes für Activity , View und ViewGroup ich gelernt, dass die programmgesteuert hinzugefügten Sichten programmgesteuert hinzugefügt werden müssen und jedes Mal, onCreate(Bundle) aufgerufen wird, die gleiche ID zugewiesen wird. Dies gilt unabhängig davon, ob es die Ansicht zum ersten Mal schafft oder die Ansicht nach der Zerstörung der Aktivität neu erstellt. Der gespeicherte Instanzstatus der programmgesteuert hinzugefügten Ansichten wird dann während des Aufrufs von Activity.onRestoreInstanceState(Bundle) wiederhergestellt. Die einfachste Antwort auf den obigen Code ist einfach, um die Prüfung auf savedInstanceState == null zu entfernen.

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Setup this activity's view. setContentView(R.layout.game_board); TableLayout table = (TableLayout) findViewById(R.id.table); int gridSize = 5; // Create the table elements and add to the table. int uniqueId = 1; for (int i = 0; i < gridSize; i++) { // Create table rows. TableRow row = new TableRow(this); row.setId(uniqueId++); for (int j = 0; j < gridSize; j++) { // Create buttons. Button button = new Button(this); button.setId(uniqueId++); row.addView(button); } // Add row to the table. table.addView(row); } } 

    Wenn es mit Ansichten mit einer ID funktioniert, warum nicht jedem Button eine ID in der Tabelle geben, wenn du sie kreisst? Sehen Sie, ob das funktioniert.

    Wie kann ich eine Anzeige programmgesteuert einer ID zuordnen?

    Diese Zeile erzeugt ein leeres Layout:

     setContentView(R.layout.game_board); 

    Außerdem ordnen Sie den Zeilen und Schaltflächen gleiche IDs zu. Sie sollten einen Zähler für die Zeilen und Tasten verwendet haben:

      int idCounter = 1; for (int i = 0; i < gridSize; i++) { TableRow row = new TableRow(this); row.setId(idCounter++); for (int j = 0; j < gridSize; j++) { Button button = new Button(this); button.setId(idCounter++); row.addView(button); } ... } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.