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

时间:2012-03-15 05:01:42

标签: android layout view

我正在尝试保存和恢复由按钮表组成的视图层次结构。表中所需的表行和按钮数在运行时才会知道,并以Activity的{​​{1}}方法以编程方式添加到膨胀的xml布局中。我的问题是:可以使用Android的默认视图保存/恢复实现来保存和恢复决赛桌吗?

我目前的尝试的一个例子如下。在初始运行时,表按预期构建。当活动被销毁时(通过旋转设备),重建的视图仅显示没有子项的空onCreate(Bundle)

TableLayout中引用的xml文件除其他外,还包括添加按钮的空setContentView(int)

TableLayout

我的理解是,Android会保存视图状态,只要它们分配了ID,并在重新创建活动时恢复视图,但现在它似乎重新定义了xml布局,仅此而已。在调试代码时,我可以确认表中的每个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); } } } 都会调用onSaveInstanceState(),但Button不是。

3 个答案:

答案 0 :(得分:12)

在搜索ActivityViewViewGroup的源代码后,我了解到必须以编程方式添加以编程方式添加的视图,并且每次都为{{1}分配相同的ID } 叫做。无论是第一次创建视图还是在销毁活动后重新创建视图,都是如此。然后,在调用onCreate(Bundle)期间,将恢复以编程方式添加的视图的已保存实例状态。对上述代码的最简单答案就是删除对Activity.onRestoreInstanceState(Bundle)

的检查
savedInstanceState == null

答案 1 :(得分:0)

如果它适用于带有ID的视图,为什么不在创建表时为每个按钮指定一个ID?看看是否有效。

How can I assign an ID to a view programmatically?

答案 2 :(得分:0)

此行重新创建一个空布局:

setContentView(R.layout.game_board);

此外,您为行和按钮分配相同的ID。您应该为行和按钮使用一个计数器:

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