TextView上的NullPointerException

时间:2012-10-12 09:33:22

标签: android layout textview nullpointerexception

我得到一个空指针异常,每次我想使用setText()更新高分文本时程序都会崩溃。是什么导致了这个问题? 这段代码是我设置布局时,布局是使用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 个答案:

答案 0 :(得分:0)

您应该在onCreate

之外的活动中将文本视图定义为类字段
TextView textBox;

public void onCreate(Bundle savedInstanceState) {
    ....
    textBox = new TextView(this);
}

答案 1 :(得分:0)

您的textBoxonCreate()方法中的局部变量。我认为你也有一个同名的成员变量。所以你实际上使用了错误的。

尝试删除TextView

中的onCreate()
// in onCreate
textBox = new TextView(this);
textBox.setId(1);
textBox.setText("HIGH SCORE");

答案 2 :(得分:0)

将TextView声明放在onCreate()

之外
TextView textBox;

public void onCreate(Bundle savedInstanceState) {
    textBox = (TextView)findViewById(id.TextBoxNameFromLayout);
}

答案 3 :(得分:-1)

您的文本框应定义为全局变量。

像这样

class MyActivity extends Activity{
    TextView textBox = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        textBox = new TextView(this);