當(dāng)安卓設(shè)備配置【一系列特征的組合:屏幕方向蛆楞,屏幕像素密度泪漂,屏幕尺寸,鍵盤類型,底座模式瓤球,以及語言等】發(fā)生改變時(shí),可能會有更合適的資源來匹配新的設(shè)備環(huán)境。
于是,Android會銷毀當(dāng)前activity河爹,為新配置尋找最佳資源,然后重啟這個(gè)activity桐款。
比如: 當(dāng)前是豎屏咸这,現(xiàn)在我mainActivity是一個(gè)ListView填充,當(dāng)我滑動一定距離后魔眨,我不小心點(diǎn)到了屏幕旋轉(zhuǎn)媳维,即豎屏變?yōu)榱藱M屏。然后問題來了遏暴,手機(jī)變?yōu)樨Q屏后侄刽,listview的item又回到最開始的地方。原因是因?yàn)榕罅梗?dāng)屏幕方向改變州丹,mainactivity先destroy,然后再onCreate杂彭,可以重寫onDestroy(), onCreate()然后打Log.d的tag驗(yàn)證当叭。
解決方法:
在onStop()方法回調(diào)之前,系統(tǒng)會自動調(diào)用onSaveInstanceState(Bundle outState)盖灸,除非用戶按返回鍵(記住蚁鳖,按返回鍵就是告訴Android,activity用完了赁炎,隨后該activity就完全從內(nèi)存中被抹掉醉箕,自然也就沒有必要為重建保存數(shù)據(jù))。
我們重寫
onSaveInstanceState(Bundle outstate){
super.onSaveInstanceState(outstate);
outstate.putInt("key",currentPosition);
}
這樣徙垫,當(dāng)屏幕旋轉(zhuǎn)時(shí)讥裤,會回調(diào)上面的函數(shù),然后將當(dāng)前ListView的position保存在key中姻报,之后我們可以在onCreate(Bundle savedInstance)中拿到
如下:
public void onCreate(Bundle savedInstance){
super.onCreate();
if(savedInstance != null){
int position = savedInstance.getInt("key");
}
}
這樣就可以拿到之前的position位置己英,然后listview定位到取出來的position即可。