如何手动调用onSaveInstanceState()

时间:2017-06-08 01:01:50

标签: android android-fragments android-activity application-state

我正在编写一个程序,我在同一个活动上调用多个布局,但后来我注意到,当我切换布局时,切换之前所做的更改不会恢复,并且不会调用onSavedInstanceState(Bundle outState)。我试图手动调用该方法,但我无法获得Bundle outState

所以问题的确如此:如何在我选择的时间获取和存储要调用和/或恢复的活动的当前状态?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact_view);
// more code
}

@Override
public void onBackPressed() {
    if (layoutId == R.layout.activity_contact_view) exit();
    else if (layoutId == R.layout.main) {
        Toast.makeText(NsdChatActivity.this, "Successful back button action", Toast.LENGTH_SHORT).show();
        setContentView(R.layout.activity_contact_view);
        refreshContactList();
    }
}

然后从一个单独的班级

public void updateList(final int found) {
    LinearLayout layxout = (LinearLayout) ((Activity)mContext).getWindow().getDecorView().findViewById(R.id.others);
    TextView t = new TextView(mContext);
    t.setClickable(true);
    t.setText(found + ". " + activity.sNames.get(found));
    t.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    t.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //show chat view
            activity.setContentView(R.layout.main);
            TextView name = (TextView)activity.findViewById(R.id.clientName);
            name.setText(activity.sNames.get(found).split(" \\(")[0]);
            final ScrollView scroll = (ScrollView)activity.findViewById(R.id.scroll);
            scroll.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view, boolean b) {
                    scroll.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
    });
    layxout.addView(t);
}

2 个答案:

答案 0 :(得分:1)

我可能会迟到,但你能做的就是让你的状态成为班上的一员。这样你就可以随时恢复状态。

@media screen and (orientation: landscape) {
  img.ri { max-height: 80%; }
}

此外,您不应该使用setContentView在视图之间切换,这是一种昂贵的方式。您可能需要检查ViewSwitcherViewFlipper或某种方式来实现碎片。

答案 1 :(得分:0)

您可以查看Application Fundamentals

  

Android在活动变得容易被系统破坏之前调用onSaveInstanceState(),但是当实例被用户操作实际销毁时(例如按下BACK键),不会打扰它调用它

因此在同一活动中调用多个布局可能不会导致上述情况。有关详细信息,请参阅问题Android: Saving a state during Android lifecycle。希望有所帮助!