android viewmodel,无法设置值
基于viewmodel中的单选按钮设置字符串值时遇到问题。我只想让用户根据单击的内容进行选择,并将其发送到视图模型 当我尝试记录该值时,它只是保持空白 我看到了一些答案,但没有一个对我的处境有帮助 我尝试设置它的片段:android viewmodel,无法设置值,android,android-fragments,radio-button,viewmodel,Android,Android Fragments,Radio Button,Viewmodel,基于viewmodel中的单选按钮设置字符串值时遇到问题。我只想让用户根据单击的内容进行选择,并将其发送到视图模型 当我尝试记录该值时,它只是保持空白 我看到了一些答案,但没有一个对我的处境有帮助 我尝试设置它的片段: public class TJPageOne extends Fragment { private TJViewModel tjViewModel; private EditText placeInput, peopleInput; private Ra
public class TJPageOne extends Fragment {
private TJViewModel tjViewModel;
private EditText placeInput, peopleInput;
private RadioGroup timeRadioGroup , peopleRadioGroup;
private RadioButton timeRadioButton, peopleRadioButton;
private Button returnButton, nextButton;
public TJPageOne() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tjViewModel = new ViewModelProvider(requireActivity()).get(TJViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_tj_page_one, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
findViews(view);
setRadioGroups();
setButtons();
}
private void findViews(View view) {
placeInput = view.findViewById(R.id.place_input);
peopleInput = view.findViewById(R.id.people_input);
returnButton = view.findViewById(R.id.tj_return);
nextButton = view.findViewById(R.id.page_one_next);
timeRadioGroup = view.findViewById(R.id.time_radiogroup);
peopleRadioGroup = view.findViewById(R.id.people_radiogroup);
}
private void setRadioGroups() {
}
private void setButtons() {
returnButton.setOnClickListener(v ->{
Intent intent = new Intent(this.requireActivity(), MainActivity.class);
startActivity(intent);
getActivity().finish();
});
nextButton.setOnClickListener(v ->{
peopleRadioGroup.setOnCheckedChangeListener((group, checkedId) -> {
// Get the selected Radio Button
if(checkedId == R.id.morning){
tjViewModel.setTimeText("Morning");
}
else if(checkedId == R.id.noonish){
tjViewModel.setTimeText("Noonish");
}
else if(checkedId == R.id.afternoon){
tjViewModel.setTimeText("Afternoon");
}
else if(checkedId == R.id.evening) {
tjViewModel.setTimeText("Evening");
}
else if(checkedId == R.id.night){
tjViewModel.setTimeText("Night");
}
else{
tjViewModel.setTimeText("No time selected");
}
});
timeRadioGroup.setOnCheckedChangeListener(((group, checkedId) -> {
if(checkedId == R.id.alone){
tjViewModel.setPeopleText("Alone");
}
else{
tjViewModel.setPeopleText(peopleInput.getText().toString());
}
}));
NavController navController = Navigation.findNavController(getView());
navController.navigate(R.id.action_tjPageOne_to_tjPageTwo);
});
}
}
视图模型:
import androidx.lifecycle.ViewModel;
import java.util.ArrayList;
public class TJViewModel extends ViewModel {
private String locationText = "";
private String timeText = "";
private String peopleText = "";
private String situationText = "";
private String behaviorText = "";
private String emotionText = "";
private String emotionalActionText = "";
private ArrayList<String> thoughtArray;
public void setlocationText(CharSequence input) {
locationText = input.toString();
}
public void setTimeText(String input) {
timeText = input;
}
public void setPeopleText(String input) {peopleText = input;}
public void setSituationText(CharSequence input){
situationText = input.toString();
}
public void setBehaviorText(CharSequence input){
behaviorText = input.toString();
}
public void setEmotionText(CharSequence input){
emotionText = input.toString();
}
public void setEmotionalActionText(CharSequence input){ emotionalActionText = input.toString(); }
public void setThoughtArray(ArrayList<String> input){ thoughtArray = input;
}
public String getLocationText() {
return locationText;
}
public String getTimeText(){ return timeText; }
public String getPeopleText() {return peopleText;}
public String getSituationText(){ return situationText; }
public String getBehaviorText(){ return behaviorText; }
public String getEmotionText(){ return emotionText; }
public String getEmotionalActionText(){ return emotionalActionText; }
public ArrayList<String> getThoughtArray(){ return thoughtArray; }
}
由于您在setOnClickListener内设置了setOnCheckedChangeListener单选按钮,因此只有在单击下一步按钮后才会进行侦听 试一试:
private void setButtons() {
returnButton.setOnClickListener(v ->{
Intent intent = new Intent(this.requireActivity(), MainActivity.class);
startActivity(intent);
getActivity().finish();
});
peopleRadioGroup.setOnCheckedChangeListener((group, checkedId) -> {
// Get the selected Radio Button
if(checkedId == R.id.morning){
tjViewModel.setTimeText("Morning");
}
else if(checkedId == R.id.noonish){
tjViewModel.setTimeText("Noonish");
}
else if(checkedId == R.id.afternoon){
tjViewModel.setTimeText("Afternoon");
}
else if(checkedId == R.id.evening) {
tjViewModel.setTimeText("Evening");
}
else if(checkedId == R.id.night){
tjViewModel.setTimeText("Night");
}
else{
tjViewModel.setTimeText("No time selected");
}
});
timeRadioGroup.setOnCheckedChangeListener(((group, checkedId) -> {
if(checkedId == R.id.alone){
tjViewModel.setPeopleText("Alone");
}
else{
tjViewModel.setPeopleText(peopleInput.getText().toString());
}
}));
nextButton.setOnClickListener(v ->{
NavController navController = Navigation.findNavController(getView());
navController.navigate(R.id.action_tjPageOne_to_tjPageTwo);
});
}
由于您在setOnClickListener内设置了setOnCheckedChangeListener单选按钮,因此只有在单击下一步按钮后才会进行侦听 试一试:
private void setButtons() {
returnButton.setOnClickListener(v ->{
Intent intent = new Intent(this.requireActivity(), MainActivity.class);
startActivity(intent);
getActivity().finish();
});
peopleRadioGroup.setOnCheckedChangeListener((group, checkedId) -> {
// Get the selected Radio Button
if(checkedId == R.id.morning){
tjViewModel.setTimeText("Morning");
}
else if(checkedId == R.id.noonish){
tjViewModel.setTimeText("Noonish");
}
else if(checkedId == R.id.afternoon){
tjViewModel.setTimeText("Afternoon");
}
else if(checkedId == R.id.evening) {
tjViewModel.setTimeText("Evening");
}
else if(checkedId == R.id.night){
tjViewModel.setTimeText("Night");
}
else{
tjViewModel.setTimeText("No time selected");
}
});
timeRadioGroup.setOnCheckedChangeListener(((group, checkedId) -> {
if(checkedId == R.id.alone){
tjViewModel.setPeopleText("Alone");
}
else{
tjViewModel.setPeopleText(peopleInput.getText().toString());
}
}));
nextButton.setOnClickListener(v ->{
NavController navController = Navigation.findNavController(getView());
navController.navigate(R.id.action_tjPageOne_to_tjPageTwo);
});
}
首先,您需要将所有
CheckedChangeListener
移动到外部,然后单击listener进行检查。为什么在ClickListener
内部有setOnCheckedChangeListener
?也许这就是问题所在。此外,如果您不使用LiveData,您将不知道值何时更新。我这样做是为了在片段中单击“下一步”按钮时获取值。首先,您需要将所有CheckedChangeListener
移至Click listener外部,然后单击check。为什么在Click listener
内部有设置CheckedChangeListener
?也许这就是问题所在。另外,如果你不使用LiveData,你将不知道值何时更新。我这样做是为了在片段中单击“下一步”按钮时获取值。感谢它的工作,我不明白一旦checkedChangeListener工作,这是多么愚蠢的错误!感谢它的工作,我不明白一旦checkedChangeListener醒来,这是多么愚蠢的错误!