Android 通过rxjava更新密码选项,改装不起作用

Android 通过rxjava更新密码选项,改装不起作用,android,retrofit,rx-java,android-livedata,Android,Retrofit,Rx Java,Android Livedata,我想为我的应用程序创建更改密码选项,该选项将使用新的pasword和Im更新当前密码,并使用rxjava和改型向服务器发送更新请求。对不起,如果我有正确的术语问题。我是android新手。我遇到的问题是,我添加到viewmodel的验证无法正常工作。我认为这是因为fragment类没有正确配置。我很难将其设置为显示错误消息(如“需要旧密码”和“需要新密码”),这些错误消息应该由viewmodel验证,并据此更改密码。 我目前从我在fragment类中制作的Toast中得到一个“无法解析方法mak

我想为我的应用程序创建更改密码选项,该选项将使用新的pasword和Im更新当前密码,并使用rxjava和改型向服务器发送更新请求。对不起,如果我有正确的术语问题。我是android新手。我遇到的问题是,我添加到viewmodel的验证无法正常工作。我认为这是因为fragment类没有正确配置。我很难将其设置为显示错误消息(如“需要旧密码”和“需要新密码”),这些错误消息应该由viewmodel验证,并据此更改密码。 我目前从我在fragment类中制作的Toast中得到一个“无法解析方法maketext”错误。 非常感谢您对此事的任何帮助。请在这里找到我的代码。另外,请让我知道我的方法是否正确,或者如何改进

UpdatePasswordFragment.java

  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mViewModel = ViewModelProviders.of(this).get(UpdatePasswordViewModel.class);
        binding.setViewModel(mViewModel);
        //mViewModel.setUser(new Gson().fromJson(getIntent().getStringExtra(Constants.INTENT_USER), User.class));
        mViewModel.setUser(new Gson().fromJson(getArguments().getString("user"), User.class));

        binding.setLifecycleOwner(this);

        mViewModel.getMessage().observe(this, s -> {
            Toast.makeText(this,s, Toast.LENGTH_LONG).show();
        });
    }
UpdatePasswordViewModel.java

public class UpdatePasswordViewModel extends ViewModel {

    private Repository Repository;
    Application application;


    public void init(Application application) {
        this.application = application;
        showSpinner.setValue(false);

        Repository = new Repository(application);
        updatePasswordMutableLiveData.setValue(new UpdatePassword());
    }

    private MutableLiveData<UpdatePassword> updatePasswordMutableLiveData = new MutableLiveData<>();
    private MutableLiveData<Boolean> showSpinner = new MutableLiveData<>();

    private final String SUCCESS_MESSAGE = "Password Successfully Changed";
    private User mUser;

    public MutableLiveData<String> getOldPassword() {
        return oldPassword;
    }

    public void setOldPassword(MutableLiveData<String> oldPassword) {
        this.oldPassword = oldPassword;
    }

    public MutableLiveData<String> getNewPassword() {
        return newPassword;
    }

    public void setNewPassword(MutableLiveData<String> newPassword) {
        this.newPassword = newPassword;
    }

    public MutableLiveData<String> getConfirmNewPassword() {
        return confirmNewPassword;
    }

    public void setConfirmNewPassword(MutableLiveData<String> confirmNewPassword) {
        this.confirmNewPassword = confirmNewPassword;
    }

    private MutableLiveData<String> oldPassword = new MutableLiveData<>();
    private MutableLiveData<String> newPassword = new MutableLiveData<>();
    private MutableLiveData<String> confirmNewPassword = new MutableLiveData<>();
    private MutableLiveData<Boolean> showLoader = new MutableLiveData<>();


    public void setUser(User user) {
        this.mUser = user;
    }

    public MutableLiveData<String> getMessage() {
        return message;
    }

    private MutableLiveData<String> message = new MutableLiveData<>();


    public MutableLiveData<Boolean> getShowLoader() {
        return showLoader;
    }




    @SuppressLint("CheckResult")
    public void changePassword() {
        showSpinner.setValue(true);

        Repository.changePassword(mUser.getUserName(), oldPassword.getValue(),newPassword.getValue())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s -> {
                    if(SUCCESS_MESSAGE.equals(s)) {
                        oldPassword.setValue("");
                        newPassword.setValue("");
                        confirmNewPassword.setValue("");
                    }

                    showSpinner.setValue(false);
                    message.setValue(s.toString());
                }, throwable -> {
                    showSpinner.setValue(false);
                    message.setValue(throwable.getLocalizedMessage());
                });


    }


    public void  savePasswordClicked(View view) {
        if(oldPassword.getValue().trim().length() == 0) {
            message.setValue("Old Password is required");
            return;
        }

        if(newPassword.getValue().trim().length() == 0) {
            message.setValue("New Password is required");
            return;
        }

        if(!newPassword.getValue().equals(confirmNewPassword.getValue())) {
            message.setValue("New Password and Confirm Password doesn't match");
            return;
        }
        changePassword();
    }
public类UpdatePasswordViewModel扩展了ViewModel{
私有存储库;
应用程序;
公共void init(应用程序){
这个应用程序=应用程序;
showSpinner.setValue(false);
存储库=新存储库(应用程序);
updatePasswordMutableLiveData.setValue(新的UpdatePassword());
}
私有MutableLiveData updatePasswordMutableLiveData=新的MutableLiveData();
私有MutableLiveData showSpinner=新的MutableLiveData();
私有最终字符串成功\u MESSAGE=“密码成功更改”;
私人用户缪斯;
public MutableLiveData getOldPassword(){
返回旧密码;
}
public void setOldPassword(MutableLiveData oldPassword){
this.oldPassword=oldPassword;
}
public MutableLiveData getNewPassword(){
返回新密码;
}
public void setNewPassword(MutableLiveData newPassword){
this.newPassword=newPassword;
}
public MutableLiveData getConfirmNewPassword(){
返回confirmNewPassword;
}
public void setConfirmNewPassword(MutableLiveData confirmNewPassword){
this.confirmNewPassword=confirmNewPassword;
}
私有MutableLiveData oldPassword=新的MutableLiveData();
私有MutableLiveData newPassword=新的MutableLiveData();
私有MutableLiveData confirmNewPassword=新的MutableLiveData();
私有MutableLiveData showLoader=新的MutableLiveData();
公共void setUser(用户){
this.mUser=用户;
}
public MutableLiveData getMessage(){
返回消息;
}
私有MutableLiveData消息=新的MutableLiveData();
public MutableLiveData getShowLoader(){
返回显示加载程序;
}
@SuppressLint(“检查结果”)
public void changePassword(){
showSpinner.setValue(true);
Repository.changePassword(mUser.getUserName()、oldPassword.getValue()、newPassword.getValue())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(s->{
if(成功消息等于){
oldPassword.setValue(“”);
newPassword.setValue(“”);
confirmNewPassword.setValue(“”);
}
showSpinner.setValue(false);
message.setValue(s.toString());
},可丢弃->{
showSpinner.setValue(false);
message.setValue(throwable.getLocalizedMessage());
});
}
已单击公共void savepassword(查看){
if(oldPassword.getValue().trim().length()=0){
message.setValue(“需要旧密码”);
返回;
}
if(newPassword.getValue().trim().length()=0){
message.setValue(“需要新密码”);
返回;
}
如果(!newPassword.getValue().equals(confirmNewPassword.getValue())){
message.setValue(“新密码和确认密码不匹配”);
返回;
}
更改密码();
}
Java

 public Observable<ApiResponse<User>> changePassword(String userId, String oldPassword, String newPassword) {
       // return mApi.updatePassword(UpdatePassword);
        return mApi.updatePassword(userId,oldPassword, newPassword );
    }
public Observable changePassword(字符串userId、字符串oldPassword、字符串newPassword){
//返回mApi.updatePassword(updatePassword);
返回mApi.updatePassword(userId、oldPassword、newPassword);
}
这是我在APi中进行的改装调用

   @PUT("user/updatepassword")
    Observable<ApiResponse<User>> updatePassword(
            @Field("currentPassword") String oldPassword,
            @Field("newPassword") String newPassword,
            @Field("userId") String userId
    );
@PUT(“用户/更新密码”)
可观测更新密码(
@字段(“currentPassword”)字符串oldPassword,
@字段(“newPassword”)字符串newPassword,
@字段(“userId”)字符串userId
);

首先,您不仅在这里使用ViewModel,还使用数据绑定。要能够使用数据绑定,您需要做的第一件事是向您的
build.gradle添加以下内容:

// enable data binding for app here
android {
    ...
    dataBinding {
        enabled = true
    }
}
第二个错误是,您正在为
MutableLiveData
创建setter和getter,您应该通过调用
.setValue(newValue)
来更改数据的值,如果您希望您的观察者收到更改通知,则对象的引用应该是不可变的

您需要做的最后一件事是确保所需字段在布局中正确绑定,在您的情况下,您需要双向绑定,例如:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@={viewmodel.rememberMe}"
/>


您可以阅读有关双向数据绑定的更多信息。

首先,您不仅在这里使用ViewModel,还使用数据绑定。要能够使用数据绑定,您需要做的第一件事是将以下内容添加到您的
build.gradle
中:

// enable data binding for app here
android {
    ...
    dataBinding {
        enabled = true
    }
}
第二个错误是,您正在为
MutableLiveData
创建setter和getter,您应该通过调用
.setValue(newValue)
来更改数据的值,如果您希望您的观察者收到更改通知,则对象的引用应该是不可变的

你最不需要做的事