保存和方向变化

问题描述:

在我的节目我恢复TableLayout,与在那里我在它动态地添加更多TableRows与4个TextViews点击一个按钮一个一个的TableRow 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的一个字符串数组。在onRestoreInstanceState我试图重新创建表。

现在我有两个问题。我的第一个问题是,我的程序没有通过onSavedInstanceState中的表格。它只是将最后一行的TextView添加到我的字符串数组中,而不是所有行中的TextView。

例如,我有两行:

行1: 'ABC' '123' '变形点焊' '456'

行2: 'CBA''321 '馈送' '654'

现在ABC和CBA应该是我的第一个字符串数组,但有两次CBA,因为这是最后一排。

我的第二个问题是onRestoreInstanceState。只要我到达'查看rowchild1 = tableRow.getChildAt(0);'我的程序崩溃了。

有谁知道解决方案吗?

+0

你检查在'savewarnum','savewarname'等一组值它们保存到一个包过吗?它们是否包含您期望的值? – foxanna

+0

这个循环for(int i = 0; i foxanna

+0

@foxanna这就是问题,保存到savewarnum等的值只是我最后一个表行的值,而不是我创建的所有行的值。我也改变了停止条件,但它仍然不能解决我如何从旧行文本中获取文本的问题。 – Distrax

你应该初始化使用前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

非常感谢你!终于为我工作。我已经尝试了几个小时,但是我没有发现缺少一条线 – Distrax