我正在创建一个Android应用程序,在启动过程中我禁用了媒体播放器的pauze按钮。单击确定按钮后(音乐开始播放),我想启用pauze按钮。
此代码工作正常,除了最后一行(我确实删除了一些不相关的行)。这给了我一个运行时错误(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);
答案 0 :(得分:2)
替换:
Button buttonPauze = (Button) findViewById(R.id.buttonPauze);
使用:
buttonPauze = (Button) findViewById(R.id.buttonPauze);
基本上,你有2 buttonPauze
个,一个作为局部变量,另一个作为类字段。通过删除Button
,您在本地使用类字段buttonPauze
并为其分配适当的对象。
与ok
相同!
答案 1 :(得分:2)
NPE是因为您在onCreate()
中为本地变量分配按钮引用,然后尝试访问未初始化的全局变量。替换这个:
Button buttonPauze = (Button) findViewById(R.id.buttonPauze);
用这个
buttonPauze = (Button) findViewById(R.id.buttonPauze);
为了避免这样的错误,您可以调整常规做法和前缀类全局变量,例如
Button mButton;
不要使用MainActivity.this.
语法。当您访问同一类的变量时,这是毫无意义的。刚
buttonPauze.setEnabled(true);
足够(BTW:它是“暂停”)。
答案 2 :(得分:0)
在第
行Button buttonPauze = (Button) findViewById(R.id.buttonPauze);
您正在定义和分配局部变量,而不是实例变量。因此,当您在行
中引用实例变量时MainActivity.this.buttonPauze.setEnabled(true);
buttonPauze
尚未设置且仍为null
。要修复,只需更改为
buttonPauze = (Button) findViewById(R.id.buttonPauze);
答案 3 :(得分:0)
因为您正在创建具有相同全局变量名称的局部变量,所以它给出了问题。
//不创建局部变量
buttonPauze = (Button) findViewById(R.id.buttonPauze);
ok = (Button) findViewById(R.id.buttonStart);
答案 4 :(得分:0)
不要两次定义buttonPause ..