-1

setText()を使用してハイスコアテキストを更新するたびに、nullポインター例外が発生し、プログラムがクラッシュします。この問題の原因は何ですか?
このコードは、レイアウトを設定したときのもので、レイアウトはopenglを使用したgameViewの一部であり、左上隅にハイスコアのテキストビューを配置します

public void onCreate(Bundle savedInstanceState) {
    SFEngine.display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();//ambl ukuran width height layar
    super.onCreate(savedInstanceState);
    gameView = new SFGameView(this);
    gameView.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    RelativeLayout layout = new RelativeLayout(this);
    layout.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));


    TextView textBox = new TextView(this);
    textBox.setId(1);
    textBox.setText("HIGH SCORE");
    textBox.setBackgroundColor(Color.BLUE);
    textBox.setWidth(SFEngine.display.getWidth()/2);
    textBox.setHeight(50);
    Button pauseButton = new Button(this);
    pauseButton.setText("PAUSE");
    pauseButton.setHeight(50);
    pauseButton.setWidth(SFEngine.display.getWidth()/2);
    pauseButton.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View v, MotionEvent e) {
            //pause game
            SFEngine.isPlaying = false;
            Intent i1 = new Intent(SFGames.this, pause.class);
            gameView.onPause();
            startActivityForResult(i1,0);//hrs pk result soalny mw blk lg
            return true;
        }
    });


    RelativeLayout.LayoutParams lp_pause = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    RelativeLayout.LayoutParams lp_hs = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    lp_hs.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

    lp_pause.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    lp_pause.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

    textBox.setLayoutParams(lp_hs);
    pauseButton.setLayoutParams(lp_pause);

    layout.addView(gameView);
    layout.addView(textBox);        
    layout.addView(pauseButton);
    setContentView(layout);

これがsetTextコードです

public boolean onTouchEvent (MotionEvent event){//buat nerima input user
    if(!SFEngine.isPlaying){
        finish();
    }
    textBox.setText("High Score :" + SFEngine.score);//here is the source of the prob
.....

エラーログ:

 10-13 22:38:34.207: E/AndroidRuntime(528): FATAL EXCEPTION: main
10-13 22:38:34.207: E/AndroidRuntime(528): java.lang.NullPointerException
10-13 22:38:34.207: E/AndroidRuntime(528):  at com.starfighter.SFGames.onTouchEvent(SFGames.java:136)
10-13 22:38:34.207: E/AndroidRuntime(528):  at  android.app.Activity.dispatchTouchEvent(Activity.java:2367)

更新:ソースコードを更新したので、textview宣言はonCreateの外にあり、現在は正常に機能しているようです。

4

4 に答える 4

0

テキストビューは、アクティビティのクラスフィールドとして、onCreate:の外で定義する必要があります。

TextView textBox;

public void onCreate(Bundle savedInstanceState) {
    ....
    textBox = new TextView(this);
}
于 2012-10-12T09:37:21.020 に答える
0

YourtextBoxonCreate()メソッドのローカル変数です。同じ名前のメンバー変数もあると思います。したがって、実際には間違ったものを使用しています。

あなたの中で削除TextViewしてみてくださいonCreate()

// in onCreate
textBox = new TextView(this);
textBox.setId(1);
textBox.setText("HIGH SCORE");
于 2012-10-12T09:37:57.973 に答える
0

TextView宣言をonCreate()の外に置きます

TextView textBox;

public void onCreate(Bundle savedInstanceState) {
    textBox = (TextView)findViewById(id.TextBoxNameFromLayout);
}
于 2012-10-12T09:38:45.147 に答える
-1

テキストボックスはグローバル変数として定義する必要があります。

このような

class MyActivity extends Activity{
    TextView textBox = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        textBox = new TextView(this);
于 2012-10-12T09:37:33.943 に答える