小部件已初始化时,空指针异常

时间:2019-07-16 19:25:55

标签: android firebase

我正在尝试更改用户身份验证电子邮件。

CustomDialogBox

public class ConfirmPasswordDialogBox extends Dialog implements android.view.View.OnClickListener {

    private ImageButton cancel, confirm;
    private EditText confirm_password;

    public ConfirmPasswordDialogBox(@NonNull Context context) {
        super(context);


    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dailog_box_foremail);

        confirm_password = findViewById(R.id.password);
        cancel = findViewById(R.id.cancel_btn);
        confirm = findViewById(R.id.confirm_btn);
        cancel.setOnClickListener(this);
        confirm.setOnClickListener(this);

    }


    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.cancel_btn:
                dismiss();
                break;
            case R.id.confirm_btn:
                String mpassword = confirm_password.getText().toString();
                if(!mpassword.equals("")){
                    new EditProfileActivity().updatingemail(mpassword);
                    dismiss();
                }else{
                    Toast.makeText(getContext(), "Password can't be empty.", Toast.LENGTH_SHORT).show();
                }
                break;


        }

    }

}

抛出空指针异常的活动

public class EditProfileActivity extends AppCompatActivity {
    private EditText descript, firstName, lastName, email;
    private Button updatebtn;
    private ImageButton back;
    private Context mcontext;

    private FirebaseAuth auth;
    private FirebaseAuth.AuthStateListener authStateListener;
    private FirebaseUser user;
    private FirebaseDatabase database;
    private DatabaseReference myRef;
    private FirebaseMethods firebaseMethods;
    private String userID;
    private ProgressDialog pb;
    private UserInformation userInformationx;


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_profile);

        mcontext = EditProfileActivity.this;
        descript = findViewById(R.id.descript);
        firstName = findViewById(R.id.firstName);
        email = findViewById(R.id.email);
        lastName = findViewById(R.id.lastName);


        auth = FirebaseAuth.getInstance();
        user = auth.getCurrentUser();
        firebaseMethods = new FirebaseMethods(mcontext);


        pb = new ProgressDialog(this);
        pb.setMessage("Updaing Profile ...");
        pb.setCancelable(true);
        pb.setCanceledOnTouchOutside(false);

        init();
        setupFirebaseAuth();



    }
    public void updatingemail(String password){

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        // Get auth credentials from the user for re-authentication. The example below shows
        // email and password credentials but there are multiple possible providers,
        // such as GoogleAuthProvider or FacebookAuthProvider.
        AuthCredential credential = EmailAuthProvider
                .getCredential(user.getEmail(), password);

        // Prompt the user to re-provide their sign-in credentials
        user.reauthenticate(credential)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        Log.d(TAG, "User re-authenticated.");
                        if(task.isSuccessful()){
                            FirebaseAuth.getInstance().fetchSignInMethodsForEmail(email.getText().toString()).addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
                                @Override
                                public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
                                    if(task.isSuccessful()){
                                        if(task.getResult().getSignInMethods().size() == 1){
                                            Toast.makeText(mcontext, "That email is already in use.", Toast.LENGTH_SHORT).show();
                                        }else{
                                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                                            user.updateEmail(email.getText().toString())
                                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<Void> task) {
                                                            if (task.isSuccessful()) {
                                                                Log.d(TAG, "User email address updated.");
                                                                Toast.makeText(mcontext, "Email address updated.", Toast.LENGTH_SHORT).show();
                                                                myRef.child(mcontext.getString(R.string.dbname_users))
                                                                        .child(userID)
                                                                        .child(mcontext.getString(R.string.email))
                                                                        .setValue(email.getText().toString());
                                                            }
                                                        }
                                                    });

                                        }
                                    }
                                }
                            });

                        }

                    }
                });

    }

EditText小部件已经初始化,但email.getText.toString()仍为null。我只是将字符串值传递给一个方法,当在对话框中单击按钮时会调用该方法。

我已经尝试并调试了我所知道的所有可能方式。

我只是想更新Firebase中的用户身份验证电子邮件。

1 个答案:

答案 0 :(得分:0)

  

EditText小部件已经初始化,但email.getText.toString()仍为null。

实际上,EditText email仅在活动的onCreate中初始化,这意味着仅当您使用startActivity(intent)打开活动时才对其进行初始化。


编辑-由于您是从ConfirmPasswordDialogBox调用EditProfileActivity的,因此以下几行应该有用。

public class ConfirmPasswordDialogBox extends Dialog {

    private ImageButton cancel, confirm;
    public EditText confirm_password;

    public ConfirmPasswordDialogBox(@NonNull Context context) {
        super(context);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dailog_box_foremail);

        confirm_password = findViewById(R.id.password);
        cancel = findViewById(R.id.cancel_btn);
        confirm = findViewById(R.id.confirm_btn);
        //cancel.setOnClickListener(this);
        //confirm.setOnClickListener(this);
    }

    public void setOnClickListeners(View.OnClickListener listener) {
        cancel.setOnClickListener(listener);
        confirm.setOnClickListener(listener);
    }

/*
    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.cancel_btn:
                dismiss();
                break;
            case R.id.confirm_btn:
                String mpassword = confirm_password.getText().toString();
                if(!mpassword.equals("")){
                    new EditProfileActivity().updatingemail(mpassword);
                    dismiss();
                }else{
                    Toast.makeText(getContext(), "Password can't be empty.", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
*/
}
public class EditProfileActivity extends AppCompatActivity implements android.view.View.OnClickListener {
    //Other code

    //At some point in some method you'll create the dialog
    //Say you create the dialog object here. Now set this activity as the onClickListener
    dialog.setOnClickListeners(this);

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.cancel_btn:
                dismiss();
                break;
            case R.id.confirm_btn:
                String mpassword = dialog.confirm_password.getText().toString();
                if(!mpassword.equals("")){
                    //Now you can directly call the method  
                    updatingemail(mpassword);
                    dismiss();
                }else{
                    Toast.makeText(getContext(), "Password can't be empty.", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    public void updatingemail(String password){

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        // Get auth credentials from the user for re-authentication. The example below shows
        // email and password credentials but there are multiple possible providers,
        // such as GoogleAuthProvider or FacebookAuthProvider.
        AuthCredential credential = EmailAuthProvider
                .getCredential(user.getEmail(), password);

        // Prompt the user to re-provide their sign-in credentials
        user.reauthenticate(credential)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        Log.d(TAG, "User re-authenticated.");
                        if(task.isSuccessful()){
                            FirebaseAuth.getInstance().fetchSignInMethodsForEmail(email.getText().toString()).addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
                                @Override
                                public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
                                    if(task.isSuccessful()){
                                        if(task.getResult().getSignInMethods().size() == 1){
                                            Toast.makeText(mcontext, "That email is already in use.", Toast.LENGTH_SHORT).show();
                                        }else{
                                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                                            user.updateEmail(email.getText().toString())
                                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<Void> task) {
                                                            if (task.isSuccessful()) {
                                                                Log.d(TAG, "User email address updated.");
                                                                Toast.makeText(mcontext, "Email address updated.", Toast.LENGTH_SHORT).show();
                                                                myRef.child(mcontext.getString(R.string.dbname_users))
                                                                        .child(userID)
                                                                        .child(mcontext.getString(R.string.email))
                                                                        .setValue(email.getText().toString());
                                                            }
                                                        }
                                                    });

                                        }
                                    }
                                }
                            });

                        }

                    }
                });
    }