可观察状态

时间:2021-04-08 12:44:51

标签: android android-livedata

你好,我有这个程序: enter image description here

输入数据后应该显示按钮波纹管但可观察根本不起作用

我为每个输入设置了 3 个状态,如果所有状态都为真,我应该显示按钮(另一个状态)

在所有字段中输入后如何显示按钮。如果您需要更多代码,请告诉我

        package com.example.android_lab1;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.lifecycle.LifecycleOwner;
    import androidx.lifecycle.Observer;
    import androidx.lifecycle.ViewModelProvider;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements LifecycleOwner {
        Button btn;
        MainActivityViewModel model;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           model = new ViewModelProvider(this).get(MainActivityViewModel.class);
            btn = findViewById(R.id.check_btn);
            EditText i_imie = findViewById(R.id.input_imie);
            EditText i_nazwisko = findViewById(R.id.input_nazwisko);
            EditText i_l_ocen = findViewById(R.id.input_l_ocen);
    
    
            i_imie.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {
                        if (i_imie.getText().toString().isEmpty()) {
                            Toast.makeText(v.getContext(), "Imie nie moze byc puste", Toast.LENGTH_SHORT).show();
                            model.setImie_status(false);
                        }else{
                            model.setImie_status(true);
                        }
                    }
                }
            });
    
    
            i_nazwisko.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {
                        if (i_nazwisko.getText().toString().isEmpty()) {
                            Toast.makeText(v.getContext(), "Nazwisko nie moze byc puste", Toast.LENGTH_SHORT).show();
                            model.setNazwisko_status(false);
                        }else{
                            model.setNazwisko_status(true);
                        }
                    }
                }
            });
    
    
            i_l_ocen.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {
                        if (i_l_ocen.getText().toString().isEmpty()) {
                            Toast.makeText(v.getContext(), "Liczba ocen nie moze byc pusta", Toast.LENGTH_SHORT).show();
                        } else {
                            int x = Integer.parseInt(i_l_ocen.getText().toString());
                            if (x < 5 || x > 15) {
                                model.setL_ocen_status(false);
                                Toast.makeText(v.getContext(), "Liczba ocen musi byc w przedziale 5 -15", Toast.LENGTH_SHORT).show();
                            }else{
                                model.setL_ocen_status(true);
                            }
                        }
    
    
                    }
                }
            });
    
    
            model.getImie().observe(this, string -> {
                i_imie.setText(string);
                if(!string.isEmpty()){
                model.setImie_status(true);
                }
            });
            model.getNazwisko().observe(this, string -> {
                i_nazwisko.setText(string);
                if(!string.isEmpty()){
                model.setNazwisko_status(true);}
            });
            model.getLOcen().observe(this, integer -> {
                i_l_ocen.setText(integer.toString());
    
                if(integer>=5 && integer<=15){
                model.setL_ocen_status(true);
                }
            });
    
            model.getBtn_status().observe(this, aBoolean -> {
                if(aBoolean == false){
                    btn.setVisibility(View.INVISIBLE);
                }else if(aBoolean ==true){
                    btn.setVisibility(View.VISIBLE);
                }
            });
    
    
            btn.setOnClickListener(v -> {
    
                checkData(i_imie, i_nazwisko, i_l_ocen);
    
            });
        }
    
        void checkData(EditText e_imie, EditText e_nazwisko, EditText e_l_ocen) {
            String imie = e_imie.getText().toString();
            String nazwisko = e_nazwisko.getText().toString();
    
            if (imie.isEmpty() || nazwisko.isEmpty() || e_l_ocen.getText().toString().isEmpty()) {
    
                if (imie.isEmpty()) {
                    e_imie.setError("Imie nie moze byc puste");
                }
    
    
                if (nazwisko.isEmpty()) {
                    e_nazwisko.setError("Nazwisko nie moze byc puste");
                }
    
    
                if (e_l_ocen.getText().toString().isEmpty()) {
                    e_l_ocen.setError("Liczba ocen nie moze byc pusta");
                }
    
            } else {
                if (Integer.parseInt(e_l_ocen.getText().toString()) < 5 || Integer.parseInt(e_l_ocen.getText().toString()) > 15) {
                    e_l_ocen.setError("Liczba ocen musi byc w zakresie 5-15");
                } else {
                    saveData(imie,nazwisko, Integer.parseInt( e_l_ocen.getText().toString()));
                }
    
            }
    
        }
    
        private void saveData(String imie, String nazwisko, Integer l_ocen) {
                   model.setImie(imie);
                   model.setNazwisko(nazwisko);
                   model.setL_ocen(l_ocen);
                   model.setNazwisko_status(true);
    
        }
    }

视图模型:

    package com.example.android_lab1;
    
    import android.view.View;
    import android.widget.Button;
    
    import androidx.lifecycle.LiveData;
    import androidx.lifecycle.MutableLiveData;
    import androidx.lifecycle.ViewModel;
    
    public class MainActivityViewModel extends ViewModel {
    
        private MutableLiveData<String> imie;
        private  MutableLiveData<String> nazwisko;
        private  MutableLiveData<Integer> l_ocen;
    
        private MutableLiveData<Boolean> imie_status, nazwisko_status, l_ocen_status, btn_status;
    
    
        public MainActivityViewModel() {
            imie = new MutableLiveData<>();
            nazwisko= new MutableLiveData<>();
            l_ocen = new MutableLiveData<>();
            imie_status = new MutableLiveData<>(false);
            nazwisko_status = new MutableLiveData<>(false);
            l_ocen_status = new MutableLiveData<>(false);
            btn_status = new MutableLiveData<>();
        }
    
    
        LiveData<String> getImie(){
            return imie;
        }
    
        LiveData<String> getNazwisko(){
            return nazwisko;
        }
    
    
        LiveData<Integer> getLOcen(){
            return l_ocen;
        }
    
        LiveData<Boolean> getBtn_status(){
            if(imie_status.getValue() ==true || nazwisko_status.getValue() == true || l_ocen_status.getValue()==true){
                btn_status.setValue(true);
            }else{
                btn_status.setValue(false);
            }
            return btn_status;
        }
    
        public void setImie(String imie) {
            this.imie.setValue(imie);
        }
    
        public void setNazwisko(String nazwisko) {
            this.nazwisko.setValue(nazwisko);
        }
    
        public void setL_ocen(Integer l_ocen) {
           this.l_ocen.setValue(l_ocen);
        }
    
        public void setImie_status(Boolean btn_status){
            this.imie_status.setValue(btn_status);
        }
    
        public void setNazwisko_status(Boolean btn_status){
            this.nazwisko_status.setValue(btn_status);
        }
    
        public void setL_ocen_status(Boolean btn_status){
            this.l_ocen_status.setValue(btn_status);
        }
    
    
        public void setBtn_status(Boolean btn_status){
            this.btn_status.setValue(btn_status);
        }
    
    
    }

1 个答案:

答案 0 :(得分:0)

在你的视图模型中,你应该创建一个方法来更新 btn_status,并在每个状态设置后调用:

private void updateBtnStatus(){
        btn_status.setValue(imie_status.getValue() || nazwisko_status.getValue() || l_ocen_status.getValue());
    }
    
    public void setImie_status(Boolean btn_status){
        this.imie_status.setValue(btn_status);
        updateBtnStatus();
    }
    
    public void setNazwisko_status(Boolean btn_status){
        this.nazwisko_status.setValue(btn_status);
        updateBtnStatus();
    }
    
    public void setL_ocen_status(Boolean btn_status){
        this.l_ocen_status.setValue(btn_status);
        updateBtnStatus();
    }

另外,您应该考虑使用 addTextChangedListener 而不是 setOnFocusChangeListener 以避免在填写完最后一个字段后不得不关注另一个字段:

i_l_ocen.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                }
            });