我正在使用ViewPager
进行注册向导,其中包含5个片段:FragmentA - > FragmentB - > FragmentC - > FragmentD - > FragmentE。 FragmentD需要来自FragmentC的数据,以便在显示其视图时向用户显示一些信息。问题是FragmentD在向用户显示FragmentC时被初始化,这意味着FragmentD所需的数据尚未就绪。因此,FragmentD无法正确显示数据,因为它的生命周期初始化方法(我用来从FragmentC获取数据)已被调用。
我已尝试设置pager.setOffscreenPageLimit(0)
,强制ViewPager
始终重建片段,但不可能,因为1是接受的最小值。
这是我的FragmentC代码的简历:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
radio0 = (RadioButton) getView().findViewById(R.id.radio_0);
radio0.setOnCheckedChangeListener(this);
text0 = (TextView) getView().findViewById(R.id.description_0);
setOnClickListener(text0, radio0);
radio1 = (RadioButton) getView().findViewById(R.id.radio_1);
radio1.setOnCheckedChangeListener(this);
text1 = (TextView) getView().findViewById(R.id.description_1);
setOnClickListener(text1, radio1);
radio2 = (RadioButton) getView().findViewById(R.id.radio_2);
radio2.setOnCheckedChangeListener(this);
text2 = (TextView) getView().findViewById(R.id.description_2);
setOnClickListener(text2, radio2);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
switch (buttonView.getId()) {
case R.id.radio_0:
radio1.setChecked(false);
radio2.setChecked(false);
choice = 0;
break;
case R.id.radio_1:
radio0.setChecked(false);
radio2.setChecked(false);
choice = 1;
break;
case R.id.radio_2:
radio0.setChecked(false);
radio1.setChecked(false);
choice = 2;
break;
}
}
}
这是我的FragmentD代码的简历:
private OnOptionSelectedListener callback;
private EditText edit0, edit1, edit2, edit3;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
callback = (OnOptionSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnOptionSelectedListener");
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
edit0 = ((EditText) getView().findViewById(R.id.edit_0));
edit1 = ((EditText) getView().findViewById(R.id.edit_1));
edit2 = ((EditText) getView().findViewById(R.id.edit_2));
edit3 = ((EditText) getView().findViewById(R.id.edit_3));
}
@Override
public void onStart() {
super.onStart();
choice = callback.getChoice();
edit0.setText(text0);
edit1.setText(text1);
edit2.setText(text2);
edit3.setText(text3);
}
public interface OnOptionSelectedListener {
public int getOption();
}
每个editText
(text0,text1,text2,text3)中的值取决于之前在FragmentC上做出的选择。但就像我之前说过的那样,在初始化FragmentC时会调用onActivityCreated
和onStart
,因此用户还没有选择任何选项,即choice
总是随附默认值,无论用户选择哪个选项都无关紧要。
我真的不知道该怎么做......有人有一些想法吗?
答案 0 :(得分:6)
忘记setOffscreenPageLimit()
并覆盖setUserVisibleHint(boolean)
方法。
检查该方法的参数是否为真,并使用给定的数据更新UI。
答案 1 :(得分:0)
只需在onCreate()中调用setOffscreenPageLimit()(在初始化ViewPager之后)。 OffscreenPageLimit设置应保留到当前页面任一侧的页面数(在您的情况下为2)。这样你的所有片段都将被实例化。
答案 2 :(得分:0)
将setOffscreenPageLimit()
增加到2,因此您知道当前所选片段后面和前面的片段仍然是实例化的。之后,由于您使用的是ViewPager
,因此您应该考虑设置onPageChangeListener()
在ViewPager
上,并以这种方式与您的活动进行交互 - 而不是使用生命周期方法。
http://developer.android.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html