从保存的状态还原视图层次不会还原以编程方式添加的视图

我试图保存和恢复由一个button表组成的视图层次结构。 表中所需的表行和button的数量直到运行时才是已知的,并且在我的ActivityonCreate(Bundle)方法中以编程方式添加到膨胀的xml布局中。 我的问题是:最终的表可以保存和恢复使用Android的默认视图保存/恢复实施?

下面是我目前尝试的一个例子。 在初始运行时,表格按预期构build。 当活动被破坏时(通过旋转设备),重build视图只显示一个没有子项的空TableLayout

setContentView(int)引用的xml文件还包括将button添加到的空TableLayout

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

我的理解是,Android保存视图的状态,只要他们有一个ID分配给他们,恢复活动重新创build时的意见,但现在似乎只是重新命名xml布局,没有更多。 在debugging代码时,我可以确认onSaveInstanceState()在表中的每个Button上被调用,但是onRestoreInstanceState(Parcelable)不是。

Solutions Collecting From Web of "从保存的状态还原视图层次不会还原以编程方式添加的视图"

在searchActivityViewViewGroup的源代码后,我了解到,编程添加的视图必须以编程方式添加,并且每次调用onCreate(Bundle)都会分配相同的ID。 无论是第一次创build视图,还是在破坏活动后重新创build视图,都是如此。 在调用Activity.onRestoreInstanceState(Bundle)过程中,保存的编程添加视图的实例状态将被恢复。 上面的代码最简单的答案就是删除savedInstanceState == null的检查。

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

如果它与带有ID的视图一起工作,为什么不在创build它们时在表中为每个button分配一个ID? 看看是否有效。

我如何以编程方式将ID分配给视图?

这一行重新创build一个空白的布局:

 setContentView(R.layout.game_board); 

此外,你分配平等的ID行和button。 你应该使用一个计数器的行和button:

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