2016-07-05 2 views
2

MainActivityでpublic voidメソッドを使用して別のレイアウトに切り替えましたが、このメソッドを呼び出すたびにアプリケーションがクラッシュします。AndroidのsetContentViewでアプリケーションがクラッシュする

logcat:

07-05 16:35:22.823 14683-14712/com.example.name.mygame I/OpenGLRenderer: Initialized EGL, version 1.4 

[ 07-05 16:35:24.724 14683:14754 D/] 
HostConnection::get() New Host Connection established 0xae4b2240, tid 14754 
07-05 16:35:28.500 14683-14754/com.example.name.mygame I/System.out: gameOverUi called! 
-------- beginning of crash 
07-05 16:35:28.558 14683-14754/com.example.name.mygame E/AndroidRuntime: FATAL EXCEPTION: Thread-218 
Process: com.example.name.mygame, PID: 14683 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.Window.setContentView(int)' on a null object reference 
at android.app.Activity.setContentView(Activity.java:2166) 
at com.example.name.mygame.MainActivity.gameOverUi(MainActivity.java:15) 
at com.example.name.mygame.GameView.gameOver(GameView.java:16) 
at com.example.name.mygame.GameView.onDraw(GameView.java:188) 
at com.example.name.mygame.GameLoopThread.run(GameLoopThread.java:37) 
07-05 16:35:30.070 14683-14754/com.example.name.mygame I/Process: Sending signal. PID: 14683 SIG: 9 

MainActivity:

package com.example.name.mygame; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new GameView(this)); 
    } 

    public void gameOverUi(){ 
     System.out.println("gameOverUi called!"); 
     setContentView(R.layout.gameover); //Crash here 
    } 
} 

GameViewクラス:

package com.example.name.mygame; 

import android.content.Context; 
import android.view.SurfaceView; 

public class GameView extends SurfaceView { 
    MainActivity mActivity = new MainActivity(); 

     public GameView(Context context) { 
     super(context); 
     //unimportant stuff 
    } 


    private void gameOver(){ 
     mActivity.gameOverUi(); 
    } 
} 

がどのように私は自分のアプリケーションをクラッシュさせることなく、コンテンツの表示を変更できますか?どんな答えでも感謝します。

+5

'mActivity =新しいMainActivity();' ...開発者のほとんどは、設定するために使用すること –

+0

のような新しい活動を行うことはありませんがoncreate mehodのレイアウト、なぜ別の方法で? –

答えて

2

あなたはGameView以内正しくあなたMainActivityクラスを参照ではありません - あなたは現在、新しいオブジェクトを作成し、表示されているあなたのActivityへの参照を取得されていませんよう。これは、アクティビティにアクセスする正しい方法ではありません。

ContextからActivity継承は、あなたは理論的にはこのような何かができるので:

public class GameView extends SurfaceView { 
    private MainActivity mActivity; 

    //Create new constructor to get the Activity 
    public GameView(Activity activity) { 
     super(activity); 
     mActivity = (MainActivity) activity; 
    } 

    private void gameOver(){ 
     mActivity.gameOverUi(); 
    } 
} 
+0

ありがとうございます。出来た :) – user3757605

2
MainActivity mActivity = new MainActivity(); 

これは問題です。

この方法で、MainActivityの新しい割り当てを作成しますが、MainActivityは参照しません。 これには、ヌルポイント例外があります。

これは避けてください。

関連する問題