Winston Liu
Winston Liu

Reputation: 77

Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference

Here are some pieces of codes:

 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);
    }

The logcat shows that Attempt to invoke virtual method 'voidandroid.widget.Button.setEnabled(boolean)' on a null object reference"

But I declare the private Button buttonLogin at the beinging, Is there something wrong?

Please give me a hand, I'll appreciate.

Upvotes: 3

Views: 13617

Answers (2)

charliebeckwith
charliebeckwith

Reputation: 1449

You have both a local variable Button buttonLogin and one declared as a field. In your onCreate method you are setting buttonLogin to the local variable and thus, the field is not initialized.

You need to change the code in your onCreate method to

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

Or if you want both...

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

Upvotes: 2

Blackbelt
Blackbelt

Reputation: 157467

But I declare the private Button buttonLogin at the beinging, Is there something wrong?

yes, there is. In onCreate you declare and initialize

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

on the method's scope, which has the same name of the class member. The scope rules hide the class member which remains not initialized. To fix it change

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

to

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

Upvotes: 2

Related Questions