0

私のプログラムでは、1 つの TableRow を持つ TableLayout があり、ボタン クリックで動的に 4 つの TextView を持つ TableRow を追加しました。携帯電話の向きを変えたら、このテーブルを保存して復元したいと思います。

これを行う必要がある次のコードがあります。

 @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 で、テーブルを再作成しようとしています。

今、私には2つの問題があります。私の最初の問題は、私のプログラムが onSavedInstanceState のテーブルを通過しないことです。すべての行の TextView ではなく、最後の行の TextView を文字列配列に追加するだけです。

たとえば、次の 2 つの行があります。

行 1: 'abc' '123' 'def' '456'

行 2: 'cba' '321' 'fed' '654'

これで、ABC と CBA が最初の文字列配列にあるはずですが、CBA は最後の行であるため 2 回あります。

私の 2 番目の問題は onRestoreInstanceState にあります。「View rowchild1 = tableRow.getChildAt(0);」に到達するとすぐに プログラムがクラッシュします。

誰かが解決策を知っていますか?

4

1 に答える 1

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);
        ...
    }
}
于 2016-12-16T10:09:46.457 に答える