0

私のプログラムでは、1つのTableRowでTableLayoutを作成し、ボタンクリックで4つのTextViewを動的に追加した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方法では、私は私がのStringArray内のすべてのTextViewを保存し、私のテーブルをつもりです。 onRestoreInstanceStateでは、テーブルを再作成しようとしています。

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

iを二列有する:

行1: 'ABC' '123' 'DEF '456'

行2: 'CBA' が '321' ' '654'

' 供給を

今やABCとCBAは最初の文字列配列になければなりませんが、CBAは最後の行であるため2回あります。

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

ソリューションを知っている人はいますか?

+0

'savewarnum'、' savewarname'などの値をチェックしたことがありますか?彼らはあなたが期待する価値を含んでいますか? – foxanna

+0

このサイクルの 'for(int i = 0; i <= rowcount; i ++)は不審なようです。たぶんあなたは停止条件として 'i foxanna

+0

@foxannaそれは問題です。savewarnumに保存される値は、私が作成したすべての行からではなく、最後のテーブル行の値だけです。また、私は停止条件を変更しましたが、それでも私の古い行からtextviewsのテキストを取得する方法の私の問題を解決していません – Distrax

答えて

0

あなたはonRestoreInstanceStateで問題になる可能性があります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); 
     ... 
    } 
} 

同じで、使用前にtableRow変数を初期化する必要があります。

+0

verryたくさんありがとう!ついに私のために働いた。私は何時間も試してみたが、その1行が見つからなかった – Distrax

関連する問題