2017-04-25 78 views
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)); 
} 

@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")); 
} 
+0

是什么库/框架呢?标记问题以获得知道此特定产品的人的注意力。 – zubergu

+0

@zubergu这是Android框架 – AxelH

+0

@zubergu我做了标签#android –

回答

-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); 
} 
+0

这是Android.not肯定它是如何工作的,但是该捆绑被用来保存屏幕(又名活动)的状态,如果屏幕是摧毁(让说放在后台并删除内存以获得在其他地方使用它)。 – AxelH

+0

我正在使用framelayout ..它不工作 –

+0

PS:不幸的是,它需要被称为OP作为writed。首先是超级方法,然后是制定者。否则,以前的值将丢失。 – AxelH

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()); 
} 
+0

它不起作用 –

0

documentation

当你的活动被销毁,因为用户按下后退或 活动结束本身,即活动 实例的系统的概念是永远的,因为行为表示活动不再需要 不见了。但是,如果系统破坏了系统约束(而不是正常应用程序行为)的活动 ,那么虽然实际活动实例不存在,但系统还是会记住它存在,因此如果用户导航回它,系统使用一组保存的数据创建 一个新的活动实例,其中 描述了活动在销毁时的状态。系统用于恢复以前状态的已保存 数据称为 实例状态,并且是存储在 捆绑包对象中的键值对的集合。

所以你的问题是错误的了解onSavedInstanceState()方法。这被称为在系统破坏你的应用程序的情况下,但不是你。

为了节省一些变量,那你需要恢复按后退按钮后onDestroy()方法调用,您必须使用SharedPreferences