2017-04-25 115 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