Hey I have a really stupid problem and I can't figure out why it is not working as expected. So I have a MultiFragment layout (each one has some different questions) using viewpager and FragmentStatePagerAdapter. When I open the screen that hosts all these fragments I am trying to restore the previous state (marking all answered questions) using a network call. However it seems that if my Fragment is not visible to the user it can't update the checked state of the radio button / checkboxes.
Does anybody know what I can do to achieve the wished behavior?
Cheers and thanks in advance!
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
presenter.restoreAnswersFromPreviousSession(questionId);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisible()) {
if (isVisibleToUser) {
presenter.restoreAnswersFromPreviousSession(questionId);
Log.d("Fit", "My Fragment is visible");
} else {
Log.d("Fit", "My Fragment is not visible");
}
}
}
Here I restore the state (called after the request is successful)
previousReplies = repliesToRestore;
for (QualityReportReply reportReply : repliesToRestore) {
int id = reportReply.id();
switch (id) {
case 201: {
boolean tooThin = (boolean) reportReply.value();
if (tooThin) {
materialTooThinGroupYes.setChecked(true);
} else {
materialTooThinGroupNo.setChecked(true);
}
break;
}
case 202: {
boolean tooThick = (boolean) reportReply.value();
if (tooThick) {
materialTooThickGroupYes.setChecked(true);
} else {
materialTooThickGroupNo.setChecked(true);
}
break;
}
case 203: {
boolean drawingThreads = (boolean) reportReply.value();
if (drawingThreads) {
materialDrawThreadsGroupYes.setChecked(true);
} else {
materialDrawThreadsGroupNo.setChecked(true);
}
break;
}
case 204: {
boolean flyingThreads = (boolean) reportReply.value();
if (flyingThreads) {
materialFlyingThreadsGroupYes.setChecked(true);
} else {
materialFlyingThreadsGroupNo.setChecked(true);
}
break;
}
case 205: {
boolean knots = (boolean) reportReply.value();
if (knots) {
materialKnotsGroupYes.setChecked(true);
} else {
materialKnotsGroupNo.setChecked(true);
}
break;
}
Therefore only one RadioButton at a time can be selected, even if it is a part of a functional group. You group radio buttons by drawing them inside a container such as a Panel control, a GroupBox control, or a form.
RadioButton should be the direct child of RadioGroup, Otherwise grouping does not work.
RadioGroup radioGroup = new RadioGroup(context); RadioButton radioBtn1 = new RadioButton(context); RadioButton radioBtn2 = new RadioButton(context); RadioButton radioBtn3 = new RadioButton(context); radioBtn1. setText("Less"); radioBtn2. setText("Normal"); radioBtn3. setText("More"); radioBtn2.
Use the android:orientation="horizontal" -attribute of the RadioGroup.
UPDATE
Here is a working example, you can see it.
I think you are restoring state on the host Activity
. Don't do this, do it in each Fragment
. Let's say you have two fragments, Passform
and Material
, so instead of doing it in Activity
, make a call inside fragment's onCreateView
.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_passform, container, false);
new FetchPassFormState().execute();
return view;
}
Update views
inside onPostExecute
of FetchPassFormState
or wherever you want, as per your need.
UPDATE
You can do one thing. You must be adding Fragments
in your QuestionsViewPagerAdapter
, try to setArguments
of your Fragments
there. Like,
Fragment fragment = new YourFragment();
Bundle bundle = new Bundle();
bundle.putString("your_key", "Your Data");
...
fragment.setArguments(bundle);
Now add this fragment
. And inside Fragment
's onCreateView
, get this Bundle
.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_material_questions, container, false);
ButterKnife.bind(this, view);
getFragmentComponent().inject(this);
presenter.setView(this);
Bundle bundle = getArguments();
String youdData = bundle.getString("your_key");
...
}
And then use this data to set views.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With