2017-10-16 87 views
0

我正在使用5個選項卡的應用程序,每個選項卡都有不同的片段。在所有這些片段中,我都有從1到10個動態創建的tablelayouts,並且它們中的每一個可以具有用戶想要的行數。每行最多可以有16列EditText,Spinner,Checkbox。我的問題是,當我旋轉我的手機,我失去了這些tablelayouts內的所有數據。託管這些片段的ViewPagerAdapter擴展了FragmentStatePagerAdapter。我不會丟失表格外的任何數據。我明白,當我旋轉手機時,他們被重新創建,但我想保留我的數據。我不想創建數據庫,因爲當我在應用程序中添加數據時,我想將所有內容保存到.txt文件中。這是代碼爲我的表在屏幕旋轉上保存動態創建的tablelayout

table18 = (TableLayout) view.findViewById(R.id.blg_parameter18_table); 
    TableRow.LayoutParams tlparams18 = new TableRow.LayoutParams(
      TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT); 
    //Create header 
    TableRow table18HeaderRow = new TableRow(view.getContext()); 
    table18HeaderRow.setLayoutParams(tlparams18); 
    TextView table18HeaderColumn0 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn0, R.string.blg_parameter18_0, tlparams18); 
    TextView table18HeaderColumn1 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn1, R.string.blg_parameter18_1, tlparams18); 
    TextView table18HeaderColumn2 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn2, R.string.blg_parameter18_2, tlparams18); 
    TextView table18HeaderColumn3 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn3, R.string.blg_parameter18_3, tlparams18); 
    TextView table18HeaderColumn4 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn4, R.string.blg_parameter18_4, tlparams18); 
    TextView table18HeaderColumn5 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn5, R.string.blg_parameter18_5, tlparams18); 
    TextView table18HeaderColumn6 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn6, R.string.blg_parameter18_6, tlparams18); 
    TextView table18HeaderColumn7 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn7, R.string.blg_parameter18_7, tlparams18); 
    TextView table18HeaderColumn8 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn8, R.string.blg_parameter18_8, tlparams18); 
    TextView table18HeaderColumn9 = new TextView(view.getContext()); 
    setTableHeaderView(table18HeaderRow, table18HeaderColumn9, R.string.blg_parameter18_9, tlparams18); 
    table18.addView(table18HeaderRow); 
    createRowTable18(table18, table18NumOfRows, tlparams18); 


public void createRowTable18(TableLayout table18, int numOfRows, TableRow.LayoutParams tlparams18) { 
    TableRow table18Row = new TableRow(table18.getContext()); 
    table18Row.setLayoutParams(tlparams18); 
    table18Row.setId(numOfRows); 
    CheckBox table18RowColumn1 = new CheckBox(getContext()); 
    CheckBox table18RowColumn2 = new CheckBox(getContext()); 
    CheckBox table18RowColumn3 = new CheckBox(getContext()); 
    CheckBox table18RowColumn4 = new CheckBox(getContext()); 
    CheckBox table18RowColumn5 = new CheckBox(getContext()); 
    CheckBox table18RowColumn6 = new CheckBox(getContext()); 
    EditText table18RowColumn7 = new EditText(getContext()); 
    final TextView table18RowColumn8 = new TextView(getContext()); 
    EditText table18RowColumn9 = new EditText(getContext()); 
    Spinner spinner18 = new Spinner(getContext()); 
    ArrayAdapter<CharSequence> adapter18 = ArrayAdapter.createFromResource(getContext(), 
      R.array.blg_parameter18_1_array, android.R.layout.simple_spinner_item); 
    adapter18.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner18.setAdapter(adapter18); 
    table18Row.addView(spinner18); 
    spinner18.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      String selection = (String) parent.getItemAtPosition(position); 
      if (!TextUtils.isEmpty(selection)) { 
       if (selection.equals(getString(R.string.blg_parameter_18_1_0))) { 
        table18RowColumn8.setText(null); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_a))) { 
        table18RowColumn8.setText("kWh"); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_b))) { 
        table18RowColumn8.setText("lt"); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_c))) { 
        table18RowColumn8.setText("lt"); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_d))) { 
        table18RowColumn8.setText("Nm^3"); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_e))) { 
        table18RowColumn8.setText("Nm^3"); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_f))) { 
        table18RowColumn8.setText("kg"); 
       } else if (selection.equals(getString(R.string.blg_parameter_18_1_g))) { 
        table18RowColumn8.setText("kWh"); 
       } 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }); 
    setTableRowCheckBox(table18Row, table18RowColumn1); 
    setTableRowCheckBox(table18Row, table18RowColumn2); 
    setTableRowCheckBox(table18Row, table18RowColumn3); 
    setTableRowCheckBox(table18Row, table18RowColumn4); 
    setTableRowCheckBox(table18Row, table18RowColumn5); 
    setTableRowCheckBox(table18Row, table18RowColumn6); 
    table18RowColumn7.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); 
    setTableRowEditView(table18Row, table18RowColumn7, tlparams18); 
    setTableRowTextView(table18Row, table18RowColumn8, tlparams18); 
    table18RowColumn7.setInputType(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL); 
    setTableRowEditView(table18Row, table18RowColumn9, tlparams18); 
    table18.addView(table18Row); 
} 


public void addRow18() { 
     createRowTable18(table18, table18NumOfRows, tlparams); 
     table18NumOfRows++; 
    } 

public void removeRow18() { 
    if (table18NumOfRows > 0) { 
     table18.removeViewAt(table18NumOfRows); 
     table18NumOfRows--; 
    } else { 
     Toast.makeText(getContext(), "Δεν υπάρχουν γραμμές στον πίνακα", Toast.LENGTH_SHORT).show(); 
    } 
} 

當我完成插入,他們有太多的保存和調用它們由一個每次我旋轉手機的一個數據之一。有任何想法嗎?

回答

0

當您的方向發生變化時,Android會銷燬您當前的活動並再次創建新活動,因此您必須管理自己的狀態。 您可以使用onSaveInstanceState保存狀態,然後會得到相同的它onCreate,例如:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("MyObject", myObject); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    if (savedInstanceState != null) { 
     final MyDataType myData = savedInstanceState.getString("MyObject")); 
     // fill your layout... 
    } 
} 

您可以管理你的片段的狀態也請here。碎片可以「保留他的實例」,請閱讀thisthis

這裏還有一個很棒的post。 在我工作的一些項目中,當應用程序未準備好屏幕旋轉時,我們必須禁用此配置。

我希望這會對你有用。

+0

我認爲我必須選擇不旋轉,因爲我瘋了......當我從風景旋轉到肖像時,我不會丟失任何數據。當我從肖像轉到風景時,我丟失了動態創建的表格中的所有數據,但保存了表格之外的其他所有內容,例如編輯文本或旋鈕。 –

0

Android會自動保存和恢復你的表格和相關的文本視圖,但你需要做一些事情。

  1. 確保您要保存的每個視圖都有一個ID。只有視圖纔會保存ID。見generateViewIdsetId

注意:爲了讓Android系統以恢復您的活動的意見的狀態,每個視圖必須有一個唯一的ID,由機器人提供:id屬性。

  • 即使一個id集,Android將默認不保存TextView大概是因爲TextView小號往往是靜態的值。您可以使用freezesText強制保存/恢復TextView
  • 安卓freezesText

    如果設置,文本視圖將包括除元數據的凍結冰柱內目前的完整文本,如當前光標位置。默認情況下,這是禁用的;當文本視圖的內容未存儲在諸如內容提供者的持久位置時,它可能很有用。對於EditText,無論屬性的值如何,都始終啓用它。

    可能有一些傾向和傾向,但這應該是所需的大部分改變。