Восстановление иерархии представления из сохраненного состояния не восстанавливает представления, добавленные программно - PullRequest
12 голосов
/ 15 марта 2012

Я пытаюсь сохранить и восстановить иерархию представления, состоящую из таблицы кнопок.Количество строк и кнопок таблицы, требуемых в таблице, неизвестно до времени выполнения и программно добавляется в раздутый макет xml в моем методе Activity * onCreate(Bundle).Мой вопрос: можно ли сохранить и восстановить финальную таблицу, используя реализацию сохранения / восстановления представления Android по умолчанию?

Ниже приведен пример моей текущей попытки.На начальном этапе таблица строится, как и ожидалось.Когда действие уничтожается (вращением устройства), в перестроенном виде отображается только пустой TableLayout без дочерних элементов.

Файл xml, указанный в setContentView(int), включает, помимо прочего, пустой 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 сохраняет состояние представлений, если им назначен идентификатор, и восстанавливает представления, когда действие воссоздается, но верно.теперь, кажется, переформатировать макет XML и ничего больше.При отладке кода я могу подтвердить, что onSaveInstanceState() вызывается для каждого Button в таблице, но onRestoreInstanceState(Parcelable) нет.

Ответы [ 3 ]

12 голосов
/ 16 марта 2012

После поиска по исходному коду для Activity, View и ViewGroup я узнал, что программно добавленные представления должны добавляться программным способом и назначаться один и тот же идентификатор при каждом вызове onCreate(Bundle).Это верно независимо от того, создается ли представление впервые или воссоздает представление после уничтожения действия.Сохраненное состояние экземпляра программно добавленных представлений затем восстанавливается во время вызова на 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);
   }
}
0 голосов
/ 15 марта 2012

Эта строка воссоздает пустой макет:

setContentView(R.layout.game_board);

Кроме того, вы назначаете одинаковые идентификаторы для строк и кнопок.Вы должны были использовать один счетчик для строк и кнопок:

    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);
        }
        ...
    }
0 голосов
/ 15 марта 2012

Если он работает с представлениями с идентификатором, почему бы не присвоить каждой кнопке идентификатор в таблице при их создании?Посмотрите, работает ли это.

Как можно программно назначить идентификатор для представления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...