【问题标题】:Save and restore TableLayout on orientation change在方向更改时保存和恢复 TableLayout
【发布时间】:2016-12-16 09:36:12
【问题描述】:

在我的程序中,我有一个带有一个 TableRow 的 TableLayout,我在其中动态添加了更多带有 4 个 TextView 的 TableRows 按钮单击。现在,如果我更改手机的方向,我想保存并恢复此表。

我有以下代码应该这样做:

 @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 行:'cba' '321' 'fed' '654'

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

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

有人知道解决办法吗?

【问题讨论】:

  • 您是否在将savewarnumsavewarname 等中的一组值保存到捆绑包之前对其进行检查?它们是否包含您期望的值?
  • 这个循环for (int i = 0; i &lt;= rowcount; i++) 似乎很可疑。也许你应该使用i &lt; rowcount 作为停止条件
  • @foxanna 问题在于保存到 savewarnum 等的值只是我最后一个表行的值,而不是我创建的所有行的值。我也改变了停止条件,但它仍然没有解决我如何从旧行的文本视图中获取文本的问题
  • 我看不到您将View row = tableLayout.getChildAt(i); 转换为tableRow 的位置。应该有tableRow = (TableRow)row;
  • 可能是缺少代码。我应该在哪里添加呢?在if (tablechild instanceof TableRow) 之前还是之后?

标签: android android-tablelayout onrestoreinstancestate onsaveinstancestate


【解决方案1】:

您应该在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);
        ...
    }
}

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多