【问题标题】:onSave- / onRestoreInstanceState not workingonSave-/onRestoreInstanceState 不起作用
【发布时间】:2019-11-28 23:39:37
【问题描述】:

情况是我想创建一个应用程序,它应该能够在每次单击按钮时在 LinearLayout 中创建一个新的 TextView。来自 EditText 的文本分配给所述 TextView。我设法做到了。但是,一旦应用程序关闭并重新启动,我一直在努力保存所有创建的 TextView。我尝试使用 OnSaveInstanceState 和 OnRestoreInstance 状态来保存一个数组,我将在 TextView 上显示的每个文本都保存到该数组中。恢复后,我将检查数组列表的大小并为数组列表中的每个值创建一个 TextView,以便全部恢复。但是,它不起作用。我知道,这些名称已保存到 arraylist,但是,当我重新启动应用程序时,什么都没有恢复。这是我的代码:

public class MainActivity extends AppCompatActivity{

    private ArrayList<String>  SubjectArray = new ArrayList<String>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button savebtn = findViewById(R.id.MAINsave);
        EditText newname = findViewById(R.id.newname);
        CheckBox promo = findViewById(R.id.MAINpromo);
        LinearLayout linearlayout = findViewById(R.id.MAINln);


        savebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                newsub();
            }
        });


    }

    private void newsub(){



        EditText newname = findViewById(R.id.newname);
        CheckBox promo = findViewById(R.id.MAINpromo);
        LinearLayout MAINln = findViewById(R.id.MAINln);


        SubjectArray.add(newname.getText().toString());
        Toast.makeText(MainActivity.this, "Added To Array", Toast.LENGTH_SHORT).show();

        RelativeLayout.LayoutParams Params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200);
        Params.setMargins(0, 10, 0, 10);

        TextView newsubject = new TextView(MainActivity.this);
        newsubject.setText(newname.getText().toString());
        newsubject.setGravity(View.TEXT_ALIGNMENT_CENTER);
        newsubject.setBackgroundColor(GRAY);
        newsubject.setLayoutParams(Params);

        MAINln.addView(newsubject);
    }

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

        SubjectArray = savedInstanceState.getStringArrayList("KEY_SUBJECTARRAY");
        LinearLayout MAINln = findViewById(R.id.MAINln);


        int subjectcount = SubjectArray.size();

        for (int i = 0; i <= subjectcount; i++) {

            RelativeLayout.LayoutParams Params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200);
            Params.setMargins(0, 10, 0, 10);

            TextView restoredsubject = new TextView(MainActivity.this);
            restoredsubject.setText(SubjectArray.get(i));
            restoredsubject.setGravity(View.TEXT_ALIGNMENT_CENTER);
            restoredsubject.setBackgroundColor(GRAY);
            restoredsubject.setLayoutParams(Params);

            MAINln.addView(restoredsubject);
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putStringArrayList("KEY_SUBJECTARRAY", SubjectArray);
    }
}

【问题讨论】:

  • 确认恢复数组的大小
  • 尝试在 onCreate 中恢复

标签: java android android-savedstate


【解决方案1】:

您可以管理本地数据库表,每次添加新的 TextView 时,只需在表中插入该 TextView 的文本。当您启动应用程序时,首先检查该表的数据,如果可用,然后获取列表中的数据。 拿到名单后 在列表大小上应用循环 在循环体内添加一个新的文本视图 在循环内的已添加 TextView 中设置当前索引文本。

您也可以在需要时清理桌子。

【讨论】:

    【解决方案2】:

    当您说“重新启动应用程序”时,您的意思是重新开始?

    savedInstanceState 不是为此而生的。在重新创建 Activity 实例时保存状态。

    例如,当用户将手机设置为横向格式时。然后发生onConfigurationChanged 事件(取决于您如何在清单中设置活动)并使用您保存在onSaveInstanceState 中的Bundle 调用onCreate

    要在应用会话中持久保存您的状态,最好的方法是将其保存在 SharedPreferences 中(并将它们加载到 MainActivity 或 Application 类的 onCreate 中)或将它们持久保存在数据库表中。

    【讨论】:

      【解决方案3】:

      onRestoreInstanceState 不是出于这个目的。它有一个不同的目的,例如,如果您的活动先前被破坏并且您要再次重新创建活动,那么您可以检索保存的数据。更多详情请点击here

      在这种情况下,建议使用首选项或轻量级持久性库,如Room。因此,您可以在应用程序的任何时候检索详细信息,直到清除应用程序的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        相关资源
        最近更新 更多