应用程序退出时不保存OnSaveInstanceState和OnRestoreInstanceState

时间:2018-05-25 11:44:55

标签: java android

我正在尝试使用 OnSaveInstanceState OnRestoreInstanceState 保存以编程方式创建的CardView和TextView,如示例代码中所示。 在调试时,我注意到值已保存,但是当我退出应用程序并重新打开它时,没有任何内容正在恢复。 我做错了什么?

**@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString("key", userInput.getText().toString());
    savedInstanceState.putInt("LayoutId", mConstraintLayout.getId());
    super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.getString("key");
    savedInstanceState.getInt("LayoutId");
}**

这是我在'OnCreate'

之后使用的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mContext = getApplicationContext();
    mConstraintLayout = findViewById(R.id.top_left);
    addButton = findViewById(R.id.add);
    addButton.setOnClickListener(new View.OnClickListener() {
                                     @Override
                                     public void onClick(View v) {
                                         View popup = findViewById(R.id.popup);
                                         popup.setVisibility(View.VISIBLE);

                                     }
                                 });

    mButton = (Button) findViewById(R.id.create);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final CardView sticker = new CardView(mContext);
            CardView.LayoutParams params = new CardView.LayoutParams(
                    CardView.LayoutParams.WRAP_CONTENT,
                    CardView.LayoutParams.WRAP_CONTENT
            );
            params.height=500;
            params.width=500;

            CheckBox privateCalendar = findViewById(R.id.checkPrivate);
            CheckBox workCalendar = findViewById(R.id.checkWork);
            CheckBox holidayCalendar = findViewById(R.id.checkHoliday);
            if (privateCalendar.isChecked()){
                sticker.setCardBackgroundColor(Color.parseColor("#FFCC00"));
            }
            else if (workCalendar.isChecked()){
                sticker.setCardBackgroundColor(Color.parseColor("#FF8080"));
            }
            else if (holidayCalendar.isChecked()){
                sticker.setCardBackgroundColor(Color.parseColor("#66B3FF"));
            }
            else{
                sticker.setCardBackgroundColor(Color.parseColor("#FFCC00"));
            }

            sticker.setId(CardView.generateViewId());
            sticker.getId();
            sticker.setTag(CARD_VIEW_TAG);
            sticker.setLayoutParams(params);

            sticker.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    ClipData.Item item = new ClipData.Item((CharSequence) sticker.getTag());
                    String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
                    ClipData data = new ClipData(sticker.getTag().toString(), mimeTypes, item);
                    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(sticker);
                    sticker.startDrag(data
                            , shadowBuilder
                            , sticker
                            , 0
                    );
                    sticker.setVisibility(View.INVISIBLE);
                    return true;



                }
            });

            TextView tv = new TextView(mContext);
            tv.setLayoutParams(params);
            tv.setBackgroundColor(Color.TRANSPARENT);
            tv.setGravity(Gravity.CENTER);
            userInput = findViewById(R.id.editText);
            tv.setText(userInput.getText());
            tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
            tv.setTextColor(Color.BLACK);
            sticker.addView(tv);
            mConstraintLayout.addView(sticker);
            View popup = findViewById(R.id.popup);
            popup.setVisibility(View.GONE);

        }
    });
}

3 个答案:

答案 0 :(得分:4)

SavedInstanceStateRestoreInstanceState如果由于配置更改而重新创建活动,例如方向更改或由于内存问题导致该系统活动导致系统崩溃,那么只有savedInstanceStaterestoreInstanceState来角色。

如果您自己完成活动并再次开始活动,则不会使用这些方法。

答案 1 :(得分:1)

尝试在SharedPreference中保存数据,而不是savedInstanceState。

SharedPreferences pref = 
getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
Editor editor = pref.edit();

用于存储数据: -

editor.putString("key", userInput.getText().toString());
editor.putInt("LayoutId", mConstraintLayout.getId());
editor.apply();

用于检索数据: -

editor.getString("key", null); // getting String
editor.getInt("LayoutId", 0); // getting Integer

答案 2 :(得分:0)

首先,如果通过"关闭应用程序"你的意思是摧毁它,这对你来说永远不会有效。

其次在onRestoreInstanceState中你不会对这些值做任何事情,你只需阅读它们但不要将它们存储在任何地方。

如果你的意思是在应用程序之间来回切换后重新创建旧表单,然后在后台销毁你的应用程序,那么你只需要在onSaveInstanceState中设置值就像你一样,在onCreate(Bundle savedInstance)中,你应该做这样的事情

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstance == null) {
        //read values from getIntent()
        key = getIntent().getString("key);
        LayoutId = getIntent().getInt("LayoutId");
    } else {
       //read values from savedInstanceState

       key = savedInstanceState.getString("key");
       LayoutId = savedInstanceState.getInt("LayoutId");
    }
}