Сохранение и восстановление TableLayout при изменении ориентации

В моей программе у меня есть TableLayout с одним TableRow, где я динамически добавил больше TableRows с 4 TextViews при нажатии кнопки. Теперь я хочу сохранить и восстановить эту таблицу, если я изменю ориентацию своего телефона.

У меня есть следующий код, который должен это сделать:

 @Override
protected void onSaveInstanceState(Bundle outState) {
    rowcount = tableLayout.getChildCount();
    for (int i = 0; i < rowcount; i++) {
        View row = tableLayout.getChildAt(i);
        if (row instanceof TableRow) {
            View rowchild1 = tableRow.getChildAt(0);
            if (rowchild1 instanceof TextView) {
                savewarnum[i] = ((TextView) rowchild1).getText().toString();
            }
            View rowchild2 = tableRow.getChildAt(1);
            if (rowchild2 instanceof TextView) {
                savewarname[i] = ((TextView) rowchild2).getText().toString();
            }
            View rowchild3 = tableRow.getChildAt(2);
            if (rowchild3 instanceof TextView) {
                savewarmeng[i] = ((TextView) rowchild3).getText().toString();
            }
            View rowchild4 = tableRow.getChildAt(3);
            if (rowchild4 instanceof TextView) {
                savewarpreis[i] = ((TextView) rowchild4).getText().toString();
            }
        }
    }
    outState.putStringArray("Nummer", savewarnum);
    outState.putStringArray("Name", savewarname);
    outState.putStringArray("Menge", savewarmeng);
    outState.putStringArray("Preis", savewarpreis);
    outState.putInt("Rows", rowcount);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    savewarnum = savedInstanceState.getStringArray("Nummer");
    savewarname = savedInstanceState.getStringArray("Name");
    savewarmeng = savedInstanceState.getStringArray("Menge");
    savewarpreis = savedInstanceState.getStringArray("Preis");
    rowcount = savedInstanceState.getInt("Rows");
    tableLayout = (TableLayout) findViewById(R.id.kaufwaren);
    for(int i=0; i<=rowcount; i++) {
        View tablechild = tableLayout.getChildAt(i);
        if (tablechild instanceof TableRow) {
            View rowchild1 = tableRow.getChildAt(0);
            if (rowchild1 instanceof TextView) {
                ((TextView) rowchild1).setText(savewarnum[i]);
            }
            View rowchild2 = tableRow.getChildAt(1);
            if (rowchild2 instanceof TextView) {
                ((TextView) rowchild2).setText(savewarname[i]);
            }
            View rowchild3 = tableRow.getChildAt(2);
            if (rowchild3 instanceof TextView) {
                ((TextView) rowchild3).setText(savewarmeng[i]);
            }
            View rowchild4 = tableRow.getChildAt(3);
            if (rowchild4 instanceof TextView) {
                ((TextView) rowchild4).setText(savewarpreis[i]);
            }
        }
        createtablerow();
    }
    super.onRestoreInstanceState(savedInstanceState);
}

В моем методе onSavedInstanceState я просматриваю свою таблицу, в которой сохраняю каждое текстовое представление в StringArray. В onRestoreInstanceState я пытаюсь воссоздать таблицу.

Теперь у меня две проблемы. Моя первая проблема заключается в том, что моя программа не проходит через таблицу в onSavedInstanceState. Он просто добавляет TextViews последней строки в мой массив строк вместо TextViews из всех строк.

Например, у меня есть две строки:

Строка 1: 'abc' '123' 'def' '456'

Строка 2: «cba» «321» «fed» «654»

Теперь ABC и CBA должны быть в моем первом массиве строк, но CBA в два раза больше, потому что это последняя строка.

Моя вторая проблема заключается в onRestoreInstanceState. Как только я достигну «View rowchild1 = tableRow.getChildAt(0);» моя программа вылетает.

Кто-нибудь знает решение?


person Distrax    schedule 16.12.2016    source источник
comment
Проверяли ли вы набор значений в savewarnum, savewarname и т. д., прежде чем они будут сохранены в пакет? Содержат ли они ожидаемые значения?   -  person foxanna    schedule 16.12.2016
comment
Этот цикл for (int i = 0; i <= rowcount; i++) кажется подозрительным. Возможно, вам следует использовать i < rowcount в качестве условия остановки   -  person foxanna    schedule 16.12.2016
comment
@foxanna, в том-то и проблема, что значения, которые сохраняются в savewarnum и т. Д., Это только значения моей последней строки таблицы, а не из всех строк, которые я создал. Также я изменил условие остановки I, но это все еще не решает мою проблему того, как я получаю тексты из текстовых представлений из моих старых строк.   -  person Distrax    schedule 16.12.2016
comment
Я не вижу, где вы превращаете View row = tableLayout.getChildAt(i); в tableRow. Должно быть tableRow = (TableRow)row;   -  person foxanna    schedule 16.12.2016
comment
может быть отсутствующий код. где именно я должен добавить это? до if (tablechild instanceof TableRow) или после?   -  person Distrax    schedule 16.12.2016


Ответы (1)


Вы должны инициализировать переменную tableRow перед использованием в onSaveInstanceState

@Override
protected void onSaveInstanceState(Bundle outState) {
    ...
    View row = tableLayout.getChildAt(i);
    if (row instanceof TableRow) {
        TableRow tableRow = (TableRow) row;
        View rowchild1 = tableRow.getChildAt(0);
        ...
    }
}

То же самое может быть проблемой в onRestoreInstanceState.

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    ...
    if (tablechild instanceof TableRow) {
        TableRow tableRow = (TableRow) tablechild;
        View rowchild1 = tableRow.getChildAt(0);
        ...
    }
}
person foxanna    schedule 16.12.2016