Я работаю над приложением, в котором есть форма входа. Я немного запутался с шаблоном, так как не понимаю, как мне обновить пользовательский интерфейс и вставить его в локальную версию после проверки в ViewModel?
Прямо сейчас я выполнил всю проверку в View (Main_activity) с помощью Livedata, настроенной в ViewModel, которая работает отлично.
Класс ViewModel
package com.practice.mvvmjava.viewmodal;
import android.app.Application;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.databinding.Bindable;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.practice.mvvmjava.BR;
import com.practice.mvvmjava.database.enitites.LoginTable;
import com.practice.mvvmjava.modal.User;
import com.practice.mvvmjava.repository.LoginRepositiory;
import java.util.List;
public class LoginViewModal extends AndroidViewModel {
private final LiveData<List<LoginTable>> getLoginDetails;
public MutableLiveData<String> EmailAddress = new MutableLiveData<>();
public MutableLiveData<String> Password = new MutableLiveData<>();
private MutableLiveData<User> userMutableLiveData;
public LoginRepositiory loginRepo;
public LoginViewModal(@NonNull Application application) {
super(application);
loginRepo = new LoginRepositiory(application);
getLoginDetails = loginRepo.getLoginDetails();
}
public MutableLiveData<User> getUser(){
if(userMutableLiveData==null){
userMutableLiveData = new MutableLiveData<>();
}
return userMutableLiveData;
}
public void onClick(View view){
User user = new User(EmailAddress.getValue(),Password.getValue());
userMutableLiveData.setValue(user);
}
}
Основная деятельность (Просмотр)
public class MainActivity extends AppCompatActivity {
private LoginViewModal loginViewModal;
private boolean isChanged = false;
private ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
loginViewModal = ViewModelProviders.of(this).get(LoginViewModal.class);
activityMainBinding = DataBindingUtil.setContentView(MainActivity.this,R.layout.activity_main);
activityMainBinding.setLifecycleOwner(this);
activityMainBinding.setLoginViewModal(loginViewModal);
// loginViewModal.getLogin().observe(this, new Observer<LoginTable>() {
// @Override
// public void onChanged(LoginTable loginTable) {
// if (TextUtils.isEmpty(Objects.requireNonNull(loginTable).getUsername())) {
// activityMainBinding.emailField.setError("required");
// activityMainBinding.emailField.requestFocus();
// }
// else if (!loginTable.isEmailValid()) {
// activityMainBinding.emailField.setError("Enter a Valid E-mail Address");
// activityMainBinding.emailField.requestFocus();
// }
// else if (TextUtils.isEmpty(Objects.requireNonNull(loginTable).getPassword())) {
// activityMainBinding.pwdField.setError("Required");
// activityMainBinding.pwdField.requestFocus();
// }
// else if (!loginTable.isPasswordLengthGreaterThan5()) {
// activityMainBinding.pwdField.setError("Enter at least 6 Digit password");
// activityMainBinding.pwdField.requestFocus();
// }
// else {
//
//// Toast.makeText(MainActivity.this,"Succesfully Logged in",Toast.LENGTH_SHORT).show();
//// Intent intent = new Intent(getApplicationContext(),RecyclerViewActivity.class);
//// startActivity(intent);
//
//
// }
// }
// });
loginViewModal.getUser().observe(this, new Observer<User>() {
@Override
public void onChanged(User user) {
if (TextUtils.isEmpty(Objects.requireNonNull(user).getUsername())) {
activityMainBinding.emailField.setError("required");
activityMainBinding.emailField.requestFocus();
}
else if (!user.isEmailValid()) {
activityMainBinding.emailField.setError("Enter a Valid E-mail Address");
activityMainBinding.emailField.requestFocus();
}
else if (TextUtils.isEmpty(Objects.requireNonNull(user).getPassword())) {
activityMainBinding.pwdField.setError("Required");
activityMainBinding.pwdField.requestFocus();
}
else if (!user.isPasswordLengthGreaterThan5()) {
activityMainBinding.pwdField.setError("Enter at least 6 Digit password");
activityMainBinding.pwdField.requestFocus();
}
else {
Toast.makeText(MainActivity.this,"Succesfully Logged in",Toast.LENGTH_SHORT).show();
// Intent intent = new Intent(getApplicationContext(),RecyclerViewActivity.class);
// startActivity(intent);
}
}
});
}
}
Модальные
package com.practice.mvvmjava.modal;
import android.util.Patterns;
public class User {
String username, password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isEmailValid() {
return Patterns.EMAIL_ADDRESS.matcher(getUsername()).matches();
}
public boolean isPasswordLengthGreaterThan5() {
return getPassword().length() > 5;
}
}
что я хочу, это когда я нажимаю кнопку «Отправить» - это метод во ViewModel, который проверяет мои учетные данные и входит в приложение
если учетные данные недействительны, обновите пользовательский интерфейс, покажите ошибку msg.