我无法保存以前的活动状态

时间:2017-04-25 07:57:59

标签: java android

在我的活动中,我可以在整个屏幕上拖动点。一旦我按下“返回”按钮,然后再次返回活动,点位置就不会保存。我该怎么办?

private ImageView map;
private ImageView dot;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);
    map = (ImageView) findViewById(R.id.map);
    dot = (ImageView) findViewById(R.id.dot);
    MotionReceiver tc = new MotionReceiver();
    LocalBroadcastManager.getInstance(this).registerReceiver(tc, new IntentFilter(Constants.TEXT_MOVEMENT));
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putFloat("X", dot.getX());
    savedInstanceState.putFloat("Y", dot.getY());
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    dot.setX(savedInstanceState.getFloat("X"));
    dot.setY(savedInstanceState.getFloat("Y"));
}

3 个答案:

答案 0 :(得分:0)

这是恢复状态的方法:

private ImageView map;
private ImageView dot;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);
    map = (ImageView) findViewById(R.id.map);
    dot = (ImageView) findViewById(R.id.dot);
    MotionReceiver tc = new MotionReceiver();
    LocalBroadcastManager.getInstance(this).registerReceiver(tc, new 
    IntentFilter(Constants.TEXT_MOVEMENT));
    if(savedInstanceState != null){
       dot.setX(savedInstanceState.getFloat("X"));
       dot.setY(savedInstanceState.getFloat("Y"));
    }

 }

 @Override
 public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putFloat("X", dot.getX());
    savedInstanceState.putFloat("Y", dot.getY());
 }

答案 1 :(得分:0)

来自 documentation

  

当您的活动被销毁时,因为用户按下后退或   活动完成了自己,系统的活动概念   实例永远消失,因为行为表明了活动   不再需要了。但是,如果系统破坏了应付的活动   系统约束(而不是正常的应用程序行为),然而   实际的Activity实例消失了,系统会记住它   存在,如果用户导航回它,系统会创建   使用一组已保存数据的活动的新实例   描述活动被销毁时的状态。保存了   系统用于恢复先前状态的数据称为   实例状态,是一个存储在a中的键值对的集合   捆绑对象。

所以你的问题是对onSavedInstanceState()方法的错误理解。如果系统销毁您的应用程序,而不是您,则会调用它。

要保存一些变量,您需要通过按后退按钮调用onDestroy()方法后恢复,您必须使用 SharedPreferences

答案 2 :(得分:-1)

我不知道你正在使用什么框架,但这些行看起来很可疑:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putFloat("X", dot.getX());
    savedInstanceState.putFloat("Y", dot.getY());
}

尝试:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putFloat("X", dot.getX());
    savedInstanceState.putFloat("Y", dot.getY());
    super.onSaveInstanceState(savedInstanceState);
}