为什么目标值为空?

问题描述 投票:0回答:1

我正在尝试使用 SharedViewModel 将数据从 Quiz1Fragment 发送到 HomeFragment。

我观察了SharedViewModel中的日志语句,目标设置正确。

问题似乎与 HomeFragment 中目标值的观察或检索有关。

我已经尝试使用 LiveData 观察 HomeFragment 的变化,但 TextView 仍然显示 null。

Logcat:`

D 在 SharedViewModel 中设定目标:200

E 目标为空

有人能找到解决方案吗?

首页片段

    public class HomeFragment extends Fragment {
    FirebaseUser user;
    TextView textView;
    TextView textviewCalories;
    FirebaseAuth auth;
    SharedViewModel sharedViewModel;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_home, container, false);
        auth = FirebaseAuth.getInstance();
        textviewCalories = view.findViewById(R.id.textViewCalories);
        user = auth.getCurrentUser();
        textView = view.findViewById(R.id.textViewCalories);
        sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);


        Integer goal = sharedViewModel.getSelectedGoal().getValue();
        if (goal != null) {
            textView.setText(String.valueOf(goal));
        } else {
            Log.e("HomeFragment", "Goal is null");
        }

        textView.setText(String.valueOf(goal));

        return view;
    }
}

共享视图模型

public class SharedViewModel extends ViewModel {

private MutableLiveData<Integer> selectGoal = new MutableLiveData<>();

public void setSelectGoal(int goal){
    Log.d("SharedViewModel", "Setting goal in SharedViewModel: " + goal);
    selectGoal.setValue(goal);
}

public LiveData<Integer> getSelectedGoal(){
    return selectGoal;
}

}

测验1片段

public class Quiz1Fragment extends Fragment {

private SharedViewModel sharedViewModel;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_quiz1, container, false);

    RadioGroup radioGroup = view.findViewById(R.id.radioGroup);
    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            int goal = 0;
            if (checkedId == R.id.lose) {
                goal = 100;
            } else if (checkedId == R.id.gain) {
                goal = 200;
            } else if (checkedId == R.id.maintain) {
                goal = 300;
            }
            sharedViewModel.setSelectGoal(goal);
        }
    });

    return view;
}

}

java android android-viewmodel mobile-development
1个回答
0
投票

你应该这样观察

liveData
。创建
fragment
时,数据可能没有更改。你无法捕捉到这个,因为
onCreate
将运行一次。这样,每次数据更改都会触发它。

    sharedViewModel.getSelectedGoal().observe(getViewLifecycleOwner(), new Observer<Integer>() {
        @Override
        public void onChanged(Integer goal) {
            if (goal != null) {
                textView.setText(String.valueOf(goal));
            } else {
                Log.e("Goal", "Goal is null");
            }
        }
    });

    return view;
© www.soinside.com 2019 - 2024. All rights reserved.