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

时间:2017-10-16 21:33:42

标签: android rotation tablelayout

我正在开发一个使用5个标签的应用,每个标签都有不同的片段。在所有这些片段中,我有1到10个动态创建的tablelayouts,其中每个都可以拥有用户想要的行数。每行最多可包含16列EditText,Spinner,Checkbox。我的问题是,当我旋转手机时,我会丢失这些表格布局中的所有数据。托管这些片段的我的ViewPagerAdapter扩展了FragmentStatePagerAdapter。我没有丢失表外的任何数据。我知道当我旋转手机时,它们会重新创建,但我想保留我的数据。我不想创建数据库,因为当我在我的应用程序中添加数据时,我想将所有内容保存到.txt文件中。这是我的一个表

的代码
 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();
    }
}

当我完成插入数据时,它们太多而无法保存,每次旋转手机时都会逐一调用它们。有什么想法吗?

2 个答案:

答案 0 :(得分: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。 在我工作的一些项目中,当应用程序没有为屏幕旋转做好准备时,我们必须禁用此配置。

我希望这对你有用。

答案 1 :(得分:0)

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

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

    注意:为了让Android系统恢复活动中的视图状态,每个视图必须具有唯一的ID,由android:id属性提供。

    1. 即使设置了ID,Android也不会默认保存TextView的值,大概是因为TextView s往往是静态的。您可以使用freezesText强制保存/恢复TextView
    2.   

      机器人:freezesText

           

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

      可能会有一些可能性,但这应该是所需的大部分变化。