是的,我已经阅读了许多其他文章,但是我无法跟进,因为我有很多变量,而不仅仅是一个或两个。
我是第一次在风景支持下制作应用程序(TIC TAC TOE)。我正在旋转屏幕时丢失数据。
package com.netlify.krupesh.tictactoe;
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
// 0 for zero and 1 for X
// 2 for empty
boolean gameActive = true;
int[] gameState = {2,2,2,2,2,2,2,2,2};
int[][] winningPositions = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6}};
int activePlayer = 0;
int[] playerScores = {0,0};
// Show Symbol on Tap
public void showSymbol(View view){
// Set Player Scores
TextView player1 = (TextView) findViewById(R.id.p1Score);
TextView player2 = (TextView) findViewById(R.id.p2Score);
player1.setText(playerScores[0]+"");
player2.setText(playerScores[1]+"");
// Get Symbol Info
ImageView symbol = (ImageView) view;
int tappedSymbol = Integer.parseInt(symbol.getTag().toString());
// Update Game state Array
if(gameState[tappedSymbol]==2 && gameActive) {
gameState[tappedSymbol] = activePlayer;
// Show Symbol with Animation
symbol.setAlpha(0f);
if (activePlayer == 0) {
symbol.setImageResource(R.drawable.zero);
activePlayer = 1;
showCurrentPlayer(2);
} else {
symbol.setImageResource(R.drawable.cross);
activePlayer = 0;
showCurrentPlayer(1);
}
symbol.animate().alpha(1).setDuration(400);
checkDraw(gameState);
for (int[] winningPosition : winningPositions) {
if (gameState[winningPosition[0]] == gameState[winningPosition[1]] && gameState[winningPosition[1]] == gameState[winningPosition[2]] && gameState[winningPosition[0]] != 2) {
showCurrentPlayer(0);
// Pause The Game
gameActive = false;
// Won the Game
String winningPlayer ;
if (gameState[winningPosition[0]] == 0) winningPlayer = "Player 1";
else winningPlayer = "Player 2";
Toast.makeText(this, winningPlayer + " won!", Toast.LENGTH_SHORT).show();
// Update Scores
playerScores[gameState[winningPosition[0]]]++;
player1.setText(playerScores[0] + "");
player2.setText(playerScores[1] + "");
}
}
}
}
public void resetBoard(View view){
android.support.v7.widget.GridLayout board = (android.support.v7.widget.GridLayout)findViewById(R.id.gridLayout);
for(int i=0; i<board.getChildCount(); i++) {
ImageView symbol = (ImageView) board.getChildAt(i);
symbol.setImageDrawable(null);
}
for(int i=0; i<gameState.length; i++ ){
gameState[i] = 2;
}
gameActive = true;
activePlayer = 0;
showCurrentPlayer(1);
}
public void checkDraw(int[] gamestate){
for(int i =0; i<gamestate.length; i++){
if(gamestate[i]==2){
return;
}
}
showCurrentPlayer(0);
Toast.makeText(this, "Match Draw!", Toast.LENGTH_SHORT).show();
}
public void resetAll(View view){
resetBoard(view);
playerScores[0]=0; playerScores[1]=0;
TextView player1 = (TextView) findViewById(R.id.p1Score);
TextView player2 = (TextView) findViewById(R.id.p2Score);
player1.setText(playerScores[0] + "");
player2.setText(playerScores[1] + "");
showCurrentPlayer(1);
}
public void showCurrentPlayer(int i){
TextView player1Heading = (TextView) findViewById(R.id.subheading1);
TextView player2Heading = (TextView) findViewById(R.id.subheading2);
if(i==1){
player1Heading.setTextColor(getResources().getColor(R.color.colorPlayer1));
player1Heading.setTypeface(null, Typeface.BOLD);
player2Heading.setTextColor(getResources().getColor(R.color.colorHeading));
player2Heading.setTypeface(null, Typeface.NORMAL);
}
if(i==2){
player2Heading.setTextColor(getResources().getColor(R.color.colorPlayer2));
player2Heading.setTypeface(null, Typeface.BOLD);
player1Heading.setTextColor(getResources().getColor(R.color.colorHeading));
player1Heading.setTypeface(null, Typeface.NORMAL);
}
if(i==0){
player1Heading.setTextColor(getResources().getColor(R.color.colorHeading));
player1Heading.setTypeface(null, Typeface.NORMAL);
player2Heading.setTextColor(getResources().getColor(R.color.colorHeading));
player2Heading.setTypeface(null, Typeface.NORMAL);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ===================== Hide Status Bar ========================== //
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// ================================================================ //
setContentView(R.layout.activity_main);
showCurrentPlayer(1);
}
}
看,有很多东西。对于所有ImageView,我需要保存设置了图像的人。现在我该如何解决旋转问题?
添加代码段的解决方案是最有用的,这对Android开发来说是新的
答案 0 :(得分:1)
@krupesh Anadkat 我对新手感到沮丧,但是 @CommonsWare 是经验丰富的开发人员,已经在游戏中待了好几天。
听从他的建议,并确保您了解他概述的基础知识,而不是盲目学习或为之着急。
不过今天是您的幸运日,所以我会给您一些代码片段(我们的千禧程序员喜欢它,是的,我说过!!),在小时候阅读并学习。
您在此处面临的问题是设备配置更改。
根据您的情况屏幕方向进行更改。
用户每次旋转该屏幕时, Android操作系统都会重新创建您的活动。 Android操作系统毫无疑问,它只是试图提高效率,因为它会检查该新方向是否有更好的资源,如果可以的话,可以使用这些资源。
这是您痛苦的根源。现在,让我们开始吧,帮助您交配。
您可以使用 Activity的类方法来解决该问题。万能的 Android操作系统杀死您的Activity之前,将在Activity的生命周期中调用 onSaveInstanceState()方法。在您的课程中,您覆盖 onSaveInstanceState()并将您想要的数据保存到 Bundle 中, onSaveInstanceState()作为参数。
然后在“活动”的 onCreate()中检查 savedInstanceState 是否不为空,如果不为空,则检索数据。
但是要当心;最好将原始数据类型保存到 Bundle 或可序列化的对象中,以避免检索陈旧的数据,即过期或无效的数据不再。
在下面查看我的SaveDataAcrossScreenOrientation活动的代码段
package com.demo.android.savedataacrossscreenrotationdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class SaveDataAcrossScreenOrientation extends AppCompatActivity {
// Key to be used for the key: value pair to be saved to the bundle
private static final String KEY_GREETING_TEXT = "greeting_text";
// The text currently displayed to the screen
private String mCurrentDisplayedText;
private TextView mGreetingTextView;
private Button mSpanishButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get references to the button and textview
mGreetingTextView = (TextView) findViewById(R.id.greeting_text_view);
mSpanishButton = (Button) findViewById(R.id.change_greeting_button);
// If mCurrentDisplayedText is inside the bundle retrieve and display it on screen
if(savedInstanceState != null) {
mCurrentDisplayedText = savedInstanceState.getString(KEY_GREETING_TEXT, "");
if (mCurrentDisplayedText != "") {
mGreetingTextView.setText(mCurrentDisplayedText);
}
}
// Set a listener on the spanish button
mSpanishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Change the english text to spanish when the button is clicked
mGreetingTextView.setText(R.string.spanish_greeting);
// Get the text currently shown in the text view
mCurrentDisplayedText = (String) mGreetingTextView.getText(); // Calling getText() returns a CharSequence cast it to a string
}
});
}
// Override onSaveInstanceState(Bundle savedInstanceState) and save mCurrentDisplayedText to the bundle
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString(KEY_GREETING_TEXT, mCurrentDisplayedText);
}
}
玩得开心!