0

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

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

@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 метод, я иду через мой стол, где я откладываю каждый TextView в StringArray. В onRestoreInstanceState я пытаюсь воссоздать таблицу.

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

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

Строка 1: 'ABC' '123' 'DEF' '456'

Строка 2: 'сЬа' '321' 'подают' '654'

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

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

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

+0

Вы проверили набор значений в 'savewarnum',' savewarname' и т. Д., Прежде чем они будут сохранены в комплекте? Они содержат значения, которые вы ожидаете? – foxanna

+0

Этот цикл 'for (int i = 0; i <= rowcount; i ++)' выглядит подозрительным. Может быть, вы должны использовать 'i foxanna

+0

@foxanna, то проблема в том, что значения, которые сохраняются в savewarnum и т. Д., Являются только значениями моей последней строки таблицы не из всех созданных мной строк. Также я изменил условие остановки I, но он все еще не решает мою проблему, как я получаю тексты из текстовых просмотров из моих старых строк. – Distrax

ответ

0

Вы должны инициализировать 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); 
     ... 
    } 
} 
+0

спасибо verry много! наконец, работал для меня. Я пробовал несколько часов, но я не нашел, что одна строка отсутствует – Distrax

Смежные вопросы