0

我正在制作一个 android 应用程序,在启动期间我禁用了媒体播放器的暂停按钮。单击确定按钮后(音乐开始播放),我想启用暂停按钮。

这段代码工作正常,除了最后一行(我确实删除了一些不相关的行)。这给了我一个运行时错误(NullPointerException)。

我使用 MainActivity.this 来访问按钮。我究竟做错了什么?

感谢您的任何帮助!

public class MainActivity extends Activity {

    // initialise variables
    TextView textOut;
    MediaPlayer mediaPlayer;
    Button buttonPauze;
    Button ok;

    // *******************************************************
    // set Layout - on create
    // *******************************************************
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textOut = (TextView) findViewById(R.id.textView1);


        // *******************************************************
        // set the play, generate and pauze buttons
        // *******************************************************
        Button buttonPauze = (Button) findViewById(R.id.buttonPauze);
        Button ok = (Button) findViewById(R.id.buttonStart);

        buttonPauze.setOnClickListener(buttonPauseOnClickListener);
    buttonPauze.setEnabled(false);
    ok.setEnabled(true);

    // *******************************************************
    // on click generate
    // *******************************************************
    ok.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            MainActivity.this.buttonPauze.setEnabled(true);
4

5 回答 5

2

代替:

Button buttonPauze = (Button) findViewById(R.id.buttonPauze);

和:

buttonPauze = (Button) findViewById(R.id.buttonPauze);

基本上,您有 2 个buttonPauze,一个作为局部变量,另一个作为类字段。通过删除Button,您在buttonPauze本地使用类字段并为其分配适当的对象。


同样的事情ok

于 2012-09-17T13:45:45.883 回答
2

NPE 是因为您将按钮引用分配给局部变量,onCreate()然后尝试访问未初始化的全局变量。替换这个:

Button buttonPauze = (Button) findViewById(R.id.buttonPauze);

有了这个

buttonPauze = (Button) findViewById(R.id.buttonPauze);

为避免此类错误,您可以采用常见做法并为类全局变量添加前缀,例如

Button mButton;

不要使用MainActivity.this.语法。这是没有意义的,因为您正在访问同一类的变量。只是

buttonPauze.setEnabled(true);

就足够了(顺便说一句:它是“暂停”)。

于 2012-09-17T13:48:04.950 回答
0

在行

Button buttonPauze = (Button) findViewById(R.id.buttonPauze);

您正在定义并分配给局部变量,而不是实例变量。因此,当您在行中引用实例变量时

MainActivity.this.buttonPauze.setEnabled(true);

buttonPauze还没有设置,它仍然是null。要修复,只需更改为

buttonPauze = (Button) findViewById(R.id.buttonPauze);
于 2012-09-17T13:46:05.647 回答
0

因为您正在创建与全局变量同名的局部变量,所以它给出了问题。

//不创建局部变量

  buttonPauze = (Button) findViewById(R.id.buttonPauze);
  ok = (Button) findViewById(R.id.buttonStart);
于 2012-09-17T13:48:29.327 回答
0

不要定义 buttonPause 两次..

于 2013-09-14T17:32:43.250 回答