2013-03-22 72 views
1

在我創建的井字遊戲應用程序中,我設置了一個替代屏幕視圖來處理方向更改。更改方向會導致應用程序崩潰

我的onCreate()在我的主要的Java文件的方法是這樣的:

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mInfoTextView = (TextView) findViewById(R.id.information); 
    mHumanScoreTextView = (TextView) findViewById(R.id.player_score); 
    mComputerScoreTextView = (TextView) findViewById(R.id.computer_score); 
    mTieScoreTextView = (TextView) findViewById(R.id.tie_score); 

    mGame = new TicTacToeGame(); 

    mBoardView = (BoardView) findViewById(R.id.board); 
    mBoardView.setGame(mGame); 
    mBoardView.setOnTouchListener(mTouchListener); 

    if (savedInstanceState == null) 
     startNewGame(); 
    else { 
     mGame.setBoardState(savedInstanceState.getCharArray("board")); 
     mGameOver = savedInstanceState.getBoolean("mGameOver"); 
     mInfoTextView.setText(savedInstanceState.getCharSequence("info")); 
     mHumanWins = savedInstanceState.getInt("mHumanWins"); 
     mComputerWins = savedInstanceState.getInt("mComputerWins"); 
     mTies = savedInstanceState.getInt("mTies"); 
     mTurn = savedInstanceState.getChar("mTurn"); 
     mFirstMove = savedInstanceState.getChar("mFirstMove"); 
    } 
    displayScores(); 
} 

我那麼有兩個方法來處理恢復與美國的儲蓄,就像這樣:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putCharArray("board", mGame.getBoardState()); 
    outState.putBoolean("mGameOver", mGameOver); 
    outState.putInt("mHumanWins", Integer.valueOf(mHumanWins)); 
    outState.putInt("mComputerWins", Integer.valueOf(mComputerWins)); 
    outState.putInt("mTies", Integer.valueOf(mTies)); 
    outState.putCharSequence("info", mInfoTextView.getText()); 
    outState.putChar("mTurn", mTurn); 
    outState.putChar("mFirstMove", mFirstMove); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    mGame.setBoardState(savedInstanceState.getCharArray("board")); 
    mGameOver = savedInstanceState.getBoolean("mGameOver"); 
    mInfoTextView.setText(savedInstanceState.getCharSequence("info")); 
    mHumanWins = savedInstanceState.getInt("mHumanWins"); 
    mComputerWins = savedInstanceState.getInt("mComputerWins"); 
    mTies = savedInstanceState.getInt("mTies"); 
    mTurn = savedInstanceState.getChar("mTurn"); 
    mFirstMove = savedInstanceState.getChar("mFirstMove"); 
} 

一切直到我對遊戲進行了重新編程,以便代替X和O字符出現在板上,代表X和O的圖片纔會出現。這樣做需要我實施TouchListener。遊戲在垂直模式下完美運行,但一旦方向改變立即崩潰。我甚至不會看到翻轉屏幕的變化。如果我在layout-land main.xml文件中查看水平佈局,它看起來很好。當它在沒有應用程序崩潰的情況下實際運行時,我無法接近它。

我是一個總新手,所以不知道是什麼導致這個或什麼相關信息發佈更多的幫助。有人有建議嗎?

編輯 - 這是logcat的錯誤日誌:雖然在實際設備上的方向變化的程序崩潰,在模擬器中它只要在程序運行崩潰

03-22 00:27:31.739: E/Trace(1042): error opening trace file: No such file or directory (2) 
03-22 00:27:31.739: W/Trace(1042): Unexpected value from nativeGetEnabledTags: 0 
03-22 00:27:31.739: W/Trace(1042): Unexpected value from nativeGetEnabledTags: 0 
03-22 00:27:31.749: W/Trace(1042): Unexpected value from nativeGetEnabledTags: 0 
03-22 00:27:31.789: W/Trace(1042): Unexpected value from nativeGetEnabledTags: 0 
03-22 00:27:31.789: W/Trace(1042): Unexpected value from nativeGetEnabledTags: 0 
03-22 00:27:31.909: D/AndroidRuntime(1042): Shutting down VM 
03-22 00:27:31.909: W/dalvikvm(1042): threadid=1: thread exiting with uncaught exception (group=0x40a70930) 
03-22 00:27:31.920: E/AndroidRuntime(1042): FATAL EXCEPTION: main 
03-22 00:27:31.920: E/AndroidRuntime(1042): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.joe.tictactoe/edu.joe.tictactoe.AndroidTicTacToeActivity}: java.lang.NullPointerException 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.os.Looper.loop(Looper.java:137) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at dalvik.system.NativeStart.main(Native Method) 
03-22 00:27:31.920: E/AndroidRuntime(1042): Caused by: java.lang.NullPointerException 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at edu.joe.tictactoe.AndroidTicTacToeActivity.resetButtons(AndroidTicTacToeActivity.java:194) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at edu.joe.tictactoe.AndroidTicTacToeActivity.displayScores(AndroidTicTacToeActivity.java:311) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at edu.joe.tictactoe.AndroidTicTacToeActivity.onCreate(AndroidTicTacToeActivity.java:93) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.Activity.performCreate(Activity.java:5104) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
03-22 00:27:31.920: E/AndroidRuntime(1042):  ... 11 more 
03-22 00:27:32.211: D/dalvikvm(1042): GC_CONCURRENT freed 351K, 17% free 2438K/2908K, paused 109ms+3ms, total 288ms 

編輯2: displayScores()和resetButtons()代碼:

192 public void resetButtons() 
193 { 
194  for (int i = 0; i < mBoardButtons.length; i++) 
195  { 
196   mBoardButtons[i].setText("");      
197   mBoardButtons[i].setEnabled(true);    
198   mBoardButtons[i].setOnClickListener(new ButtonClickListener(i)); 
199  } 
200 } 

304 private void displayScores() { 
305  mHumanScoreTextView.setText(Integer.toString(mHumanWins)); 
306  mComputerScoreTextView.setText(Integer.toString(mComputerWins)); 
307  mTieScoreTextView.setText(Integer.toString(mTies)); 
308 
309 
310  char [] temp = mGame.getBoardState(); 
311  resetButtons(); 
312 
313  for (int i = 0; i < TicTacToeGame.BOARD_SIZE; i++) 
314   if (temp [i] != TicTacToeGame.OPEN_SPOT) setMove(temp [i], i); 
315 } 

編輯3:問題解決 本來,板使用用x或o字符填充的按鈕。我刪除了這些使用圖標,但忘記刪除resetButtons()行和代碼。它試圖重置不再存在的東西。

+0

嗯,首先,當方向改變時,活動將被破壞並重新創建,所以我猜你會得到一個空指針錯誤。也許你可以發佈錯誤日誌? – cwhsu 2013-03-22 00:23:48

+0

如何找到錯誤日誌? – 2013-03-22 00:24:30

+0

好吧,如果你在這裏使用Eclipse是官方指南。 http://developer.android.com/tools/debugging/ddms.html – cwhsu 2013-03-22 00:25:47

回答

1

非常感謝所有幫助過此評論的人。否則我不知道去哪裏看。

最初,董事會使用在onCreate()中初始化的按鈕,並在遊戲進行時用字符x或o填充。

我刪除了這些按鈕,畫了一個網格,並使用座標來放置圖片來表示x和o。但是,我忘記刪除了resetButtons()命令,這意味着應用程序啓動時它試圖清除一些不存在的內容。刪除這段代碼後,一切都完美無缺。