我在制作一个简单的游戏,它使用GridView
和一个自定义的Adapter
。这基本上是一个玩家可以在GridView中移动的游戏(只需更改单元格的图像)。游戏有10个级别。问题是,当我离开活动时(例如回到MainActivity),游戏被重置。当然,当电话关闭并重置游戏时也是如此。如何在Android中保存和加载GridView的状态
我想保留游戏状态,所以当玩家进入GameActivity
时,他/她可以继续游戏。
我只需要保存3件东西,适配器,级数和可用的移动。只是,如果我知道如何工作了这一点,我可以实现我需要什么:
public class GameState implements Serializable {
private GameAssetAdapter mAdapter;
private int mLevel;
private int mAvailableMoves;
public GameState(GameAssetAdapter adapter, int level, int availableMoves) {
mAdapter = adapter;
mLevel = level;
mAvailableMoves = availableMoves;
}
public GameAssetAdapter getAdapter() {
return mAdapter;
}
public int getLevel() {
return mLevel;
}
public int getAvailableMoves() {
return mAvailableMoves;
}
}
所以现在的问题是,我怎么能这个对象保存到内部存储和retrive回来必要的时候?
我已经尝试了onSaveInstanceState
,但它不能按预期工作。关机/开机将重置此项。即使用户在Android应用程序列表中抹去应用程序,它也会被重置。我该怎么办?
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(AppConstants.GAME_SAVE_ASSET_ADAPTER, mGameAssetAdapter);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
if(savedInstanceState != null)
{ //Restore mGameAssetAdapter if was saved perviously
if(mGameAssetAdapter == null){
restoreGameAssetAdapter(savedInstanceState);
}
}
//TODO get level and states!!
mGameGridView = (GameGridView)findViewById(R.id.game_grid_view);
mGameGridView.setNumColumns(GameConstants.COLUMNS);
mGameGridView.setColumnWidth(GameHelper.getOptimumAssetImageWidth(this,
GameConstants.COLUMNS));
if(mGameAssetAdapter == null) {
mGameAssetAdapter = new GameAssetAdapter(this, mLevel);
}
mGameGridView.setAdapter(mGameAssetAdapter);
this.setTitle("Snakes and Ladders - Level " + mLevel);
setupEvents();
}
private void restoreGameAssetAdapter(Bundle savedInstanceState) {
if(savedInstanceState.getSerializable("GAME_ASSET_ADAPTER") != null){
mGameAssetAdapter =
(GameAssetAdapter) savedInstanceState.
getSerializable("GAME_ASSET_ADAPTER");
Log.v(TAG, "Restored saved GameAssetAdapter! Hoooray!");
}
}