我正在尝试使用 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;
}
}
你应该这样观察
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;