0

내 프로그램에서 버튼 클릭시 4 개의 TextView가있는 TableRow를 추가 한 TableRowout이있는 TableLayout이 있어야합니다. 이제 휴대 전화의 방향을 변경하면이 테이블을 저장하고 복원하려고합니다.오리엔테이션 변경시 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의 모든 텍스트 뷰를 저장 내 테이블을 통해거야. onRestoreInstanceState에서 테이블을 다시 만들려고합니다.

이제 두 가지 문제가 있습니다. 내 첫 번째 문제는 내 프로그램이 onSavedInstanceState의 테이블을 통과하지 않는다는 것입니다. 단지 모든 행의 TextViews 대신 마지막 행의 TextViews를 문자열 배열에 추가합니다.

행 1 :

나는 두 행이 'ABC' '데프' '123'456 '

행 2'CBA '321'공급 '654'

이제 ABC와 CBA가 첫 번째 문자열 배열에 있어야하지만 마지막 행이기 때문에 CBA가 두 번 있습니다.

두 번째 문제는 onRestoreInstanceState에 있습니다. 'View rowchild1 = tableRow.getChildAt (0);'에 도달하자마자 ' 내 프로그램이 충돌합니다.

해결책을 아는 사람이 있습니까?

+0

번들에 저장되기 전에'savewarnum','savewarname' 등에서 값의 집합을 확인 했습니까? 그들은 당신이 기대하는 가치를 포함하고 있습니까? – foxanna

+0

이주기'for (int i = 0; i <= 행 개수; i ++)는 의심스러운 것처럼 보입니다. 어쩌면 당신은 stop 조건으로'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 변수를 초기화해야한다.

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    ... 
    if (tablechild instanceof TableRow) { 
     TableRow tableRow = (TableRow) tablechild; 
     View rowchild1 = tableRow.getChildAt(0); 
     ... 
    } 
} 
+0

많이 verry 고마워요! 마침내 나를 위해 일했다. 나는 몇 시간 동안 노력했지만 그 한 줄을 놓치지 않았다. – Distrax