Как показать проверку в пользовательском интерфейсе входа в систему из Viewmodal путем расширения viewmodal? - PullRequest
0 голосов
/ 28 июня 2019

Я работаю над приложением, в котором есть форма входа. Я немного запутался с шаблоном, так как не понимаю, как мне обновить пользовательский интерфейс и вставить его в локальную версию после проверки в 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.

1 Ответ

0 голосов
/ 28 июня 2019

Создайте переменную в вашей ViewModel, которая даст флаг, чтобы показать представление или нет

XML:

  <include
   android:id="@+id/passwordInfoLayout"
   layout="@layout/password_info_layout"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{login.passwordInfoLayoutVisible? 
   View.VISIBLE:View.GONE}"
   android:layout_below="@+id/info_image"
   android:layout_alignParentRight="true"
   android:layout_alignParentEnd="true"/>

Так что здесь видимость зависит от переменной passwordInfoLayoutVisible, которая является привязываемой

Java-код:

 public void setPasswordInfoLayoutVisible(Boolean passwordInfoLayoutVisible) {
    isPasswordInfoLayoutVisible = passwordInfoLayoutVisible;
}

Boolean isPasswordInfoLayoutVisible=false;

@Bindable
public boolean isPasswordInfoLayoutVisible() {
    return isPasswordInfoLayoutVisible;
}

Так что теперь, просто изменив значение isPasswordInfoLayoutVisible, представление будет автоматически информироваться о том, чтобы быть видимым или нет.Надеюсь, это поможет.

...