Reiniciando um jogo Tic-tac-toe no Android depois de fechar o fragmento
Estou aprendendo o desenvolvimento do Android criando um projeto de teste: Tic-tac-toe. Meu aplicativo jogo da velha começa com uma atividade do menu principal com umButton
que diz New Game. Após clicar em Novo jogo, é iniciada uma atividade com um fragmento que contém um jogo Tic-Tac-Toe (em um GridLayout). O usuário pode jogar, mas quando voltar ao menu principal, o estado do jogo não será salvo.
Quero mudar isso para que, quando o usuário voltar ao menu principal, ele verá um novoButton
chamado "Continuar" (além do botão "Novo jogo"). Depois que o usuário clica em "Continuar", o jogo que estava jogando antes continua. Se clicar no botão "Novo jogo", um novo jogo será lançado como antes.
Usando oonSaveInstanceState
método e umBundle
savedInstanceState
, Pude preservar o estado do jogo nas alterações de orientação (salvando os dados da classe TicTacToe subjacente). Meu código abaixo mostra como eu fiz isso. Gostaria de fazer algo semelhante desta vez novamente - li sobre isso, mas não entendo bem a melhor maneira de começar. Alguém pode me mostrar os passos certos?
Observe que estou fazendo isso programaticamente (ou seja, projetando o layout fora dos arquivos xml)!
MinhasMainMenu
classe:
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);
}
}
com um arquivo xml correspondenteactivity_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>
Agora meuMainGame.class
se parece com isso:
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());
}
}
}
Obrigado por qualquer ajuda.