在屏幕旋转上保存动态创建的tablelayout

问题描述:

我正在使用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(); 
    } 
} 

当我完成插入,他们有太多的保存和调用它们由一个每次我旋转手机的一个数据之一。有任何想法吗?

当您的方向发生变化时,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

我认为我必须选择不旋转,因为我疯了......当我从风景旋转到肖像时,我不会丢失任何数据。当我从肖像转到风景时,我丢失了动态创建的表格中的所有数据,但保存了表格之外的其他所有内容,例如编辑文本或旋钮。 –

Android会自动保存和恢复你的表格和相关的文本视图,但你需要做一些事情。

  1. 确保您要保存的每个视图都有一个ID。只有视图才会保存ID。见generateViewIdsetId

注意:为了让Android系统以恢复您的活动的意见的状态,每个视图必须有一个唯一的ID,由机器人提供:id属性。

  1. 即使一个id集,Android将默认不保存TextView大概是因为TextView小号往往是静态的值。您可以使用freezesText强制保存/恢复TextView
  2. 安卓freezesText

    如果设置,文本视图将包括除元数据的冻结冰柱内目前的完整文本,如当前光标位置。默认情况下,这是禁用的;当文本视图的内容未存储在诸如内容提供者的持久位置时,它可能很有用。对于EditText,无论属性的值如何,都始终启用它。

    可能有一些倾向和倾向,但这应该是所需的大部分改变。

开始=“2”>