在方向更改时保存和恢复 TableLayout
Save and restore TableLayout on orientation change
在我的程序 I 中,有一个带有一个 TableRow 的 TableLayout,我在其中添加了更多带有 4 个 TextView 的 TableRow,在单击按钮时动态添加。现在,如果我更改 phone.
的方向,我想保存并恢复此 table
我有以下代码可以执行此操作:
@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 方法中,我将通过 table 将每个 Textview 保存在 StringArray 中。在 onRestoreInstanceState 中,我正在尝试重新创建 table。
现在我有两个问题。我的第一个问题是,我的程序没有通过 onSavedInstanceState 中的 table。它只是将最后一行的 TextView 添加到我的字符串数组中,而不是所有行中的 TextView。
例如我有两行:
第 1 行:'abc'“123”'def'“456”
第 2 行:'cba'“321”'fed'“654”
现在 ABC 和 CBA 应该在我的第一个字符串数组中,但是 CBA 有两倍,因为它是最后一行。
我的第二个问题在 onRestoreInstanceState 中。一旦达到 'View rowchild1 = tableRow.getChildAt(0);',我的程序就会崩溃。
有人知道解决办法吗?
您应该在 onSaveInstanceState
中使用之前初始化 tableRow
变量
@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);
...
}
}
在我的程序 I 中,有一个带有一个 TableRow 的 TableLayout,我在其中添加了更多带有 4 个 TextView 的 TableRow,在单击按钮时动态添加。现在,如果我更改 phone.
的方向,我想保存并恢复此 table我有以下代码可以执行此操作:
@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 方法中,我将通过 table 将每个 Textview 保存在 StringArray 中。在 onRestoreInstanceState 中,我正在尝试重新创建 table。
现在我有两个问题。我的第一个问题是,我的程序没有通过 onSavedInstanceState 中的 table。它只是将最后一行的 TextView 添加到我的字符串数组中,而不是所有行中的 TextView。
例如我有两行:
第 1 行:'abc'“123”'def'“456”
第 2 行:'cba'“321”'fed'“654”
现在 ABC 和 CBA 应该在我的第一个字符串数组中,但是 CBA 有两倍,因为它是最后一行。
我的第二个问题在 onRestoreInstanceState 中。一旦达到 'View rowchild1 = tableRow.getChildAt(0);',我的程序就会崩溃。
有人知道解决办法吗?
您应该在 onSaveInstanceState
tableRow
变量
@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);
...
}
}