Возобновление игры в крестики-нолики в Android после закрытия фрагмента
Я изучаю разработку под Android, создав тестовый проект: крестики-нолики. Мое приложение Tic-tac-toe начинается с действия в главном меню сButton
что говорит Новая Игра. После нажатия кнопки «Новая игра» запускается действие с фрагментом, содержащим игру «Крестики-нолики» (в GridLayout). Пользователь может играть в игру, но когда он возвращается в главное меню, состояние игры не сохраняется.
Я хочу изменить это так, чтобы когда пользователь вернется в главное меню, он увидит новоеButton
называется «Продолжить» (в дополнение к кнопке «Новая игра»). Как только пользователь нажимает «Продолжить», игра, в которую он играл до этого, продолжается. Если нажать кнопку «Новая игра», новая игра будет запущена, как и раньше.
ИспользуяonSaveInstanceState
метод иBundle
savedInstanceState
Я смог сохранить состояние игры при изменении ориентации (сохранив данные из базового класса TicTacToe). Мой код ниже показывает, как я это сделал. Я хотел бы сделать что-то подобное на этот раз снова - я читал об этом, но я не совсем понимаю, как лучше начать. Кто-нибудь может показать мне правильные шаги?
Обратите внимание, что я делаю это программно (т.е. проектирую макет вне XML-файлов)!
мойMainMenu
учебный класс:
public class MainMenu extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void startGame(View view) {
Intent intent = new Intent(this,MainGame.class);
startActivity(intent);
}
}
с соответствующим XML-файломactivity_main_game
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/new_game"
android:onClick="startGame"
/>
</RelativeLayout>
Теперь мойMainGame.class
выглядит так:
public class MainGame extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_game);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new BoardFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_game, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public static class BoardFragment extends Fragment {
public TicTacToe t = new TicTacToe(); //A class I wrote that launches a simple TicTacToe game
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
t = new TicTacToe(savedInstanceState.getInt("TicTacToeData"),
);
}
//Graphics stuff here: variable rootView which contains the TicTacToe grid is defined
//and onClickListeners are added to the ImageViews in the GridLayout which makes corresponding
//changes to t.
return rootView;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("TicTacToeData", t.getGameData());
}
}
}
Спасибо за любую помощь.