Android 通过rxjava更新密码选项,改装不起作用
我想为我的应用程序创建更改密码选项,该选项将使用新的pasword和Im更新当前密码,并使用rxjava和改型向服务器发送更新请求。对不起,如果我有正确的术语问题。我是android新手。我遇到的问题是,我添加到viewmodel的验证无法正常工作。我认为这是因为fragment类没有正确配置。我很难将其设置为显示错误消息(如“需要旧密码”和“需要新密码”),这些错误消息应该由viewmodel验证,并据此更改密码。 我目前从我在fragment类中制作的Toast中得到一个“无法解析方法maketext”错误。 非常感谢您对此事的任何帮助。请在这里找到我的代码。另外,请让我知道我的方法是否正确,或者如何改进 UpdatePasswordFragment.javaAndroid 通过rxjava更新密码选项,改装不起作用,android,retrofit,rx-java,android-livedata,Android,Retrofit,Rx Java,Android Livedata,我想为我的应用程序创建更改密码选项,该选项将使用新的pasword和Im更新当前密码,并使用rxjava和改型向服务器发送更新请求。对不起,如果我有正确的术语问题。我是android新手。我遇到的问题是,我添加到viewmodel的验证无法正常工作。我认为这是因为fragment类没有正确配置。我很难将其设置为显示错误消息(如“需要旧密码”和“需要新密码”),这些错误消息应该由viewmodel验证,并据此更改密码。 我目前从我在fragment类中制作的Toast中得到一个“无法解析方法mak
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)
来更改数据的值,如果您希望您的观察者收到更改通知,则对象的引用应该是不可变的
你最不需要做的事