尝试在空对象引用上调用虚方法'void android.widget.Button.setEnabled(boolean)'

时间:2015-04-03 15:23:35

标签: android null virtual invoke

以下是一些代码:

 private Button buttonLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
Button buttonLogin = (Button)findViewById(R.id.sign_in_button);
    buttonLogin.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {

            new LoginTask().execute(
            ((EditText)findViewById(R.id.account)).getText().toString(),
            ((EditText)findViewById(R.id.password)).getText().toString()
            );

        }
    });

    // Set up the login form.
enter code here
}


private class LoginTask extends AsyncTask<String, String, String> {
    LoginTask() {
       buttonLogin.setEnabled(false);
    }

logcat显示了这一点     Attempt to invoke virtual method 'voidandroid.widget.Button.setEnabled(boolean)' on a null object reference"

但我在正在宣布私人按钮按钮登录, 有什么不对吗?

请帮我一把,我会很感激。

2 个答案:

答案 0 :(得分:1)

  

但是我宣布私人按钮按钮登录,是否存在   有什么不对吗?

是的,有。在onCreate中声明并初始化

Button buttonLogin = (Button)findViewById(R.id.sign_in_button);

关于方法的范围,它与类成员的名称相同。范围规则隐藏未初始化的类成员。修复它改变

Button buttonLogin = (Button)findViewById(R.id.sign_in_button);

 buttonLogin = (Button)findViewById(R.id.sign_in_button);  

答案 1 :(得分:0)

你有一个局部变量Button buttonLogin和一个声明为字段的。在onCreate方法中,您将buttonLogin设置为局部变量,因此该字段未初始化。

您需要将onCreate方法中的代码更改为

buttonLogin = (Button) findViewById(R.id.sign_in_button);

或者如果你想要两个......

Button buttonLogin = (Button) findViewById(R.id.sign_in_button);
this.buttonLogin = buttonLogin;