输入数据后应该显示按钮波纹管但可观察根本不起作用
我为每个输入设置了 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);
}
}
答案 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) {
}
});