gpt4 book ai didi

android - 防止 ViewPager 始终初始化下一个 fragment (位置 n+1)

转载 作者:太空宇宙 更新时间:2023-11-03 12:19:20 25 4
gpt4 key购买 nike

我正在使用一个 ViewPager 做一个注册向导,里面有 5 个 fragment :FragmentA -> FragmentB -> FragmentC -> FragmentD -> FragmentE。 FragmentD 需要来自 FragmentC 的数据,以便在显示其 View 时向用户显示一些信息。问题是 FragmentD 在向用户显示 FragmentC 时被初始化,这意味着 FragmentD 所需的数据尚未准备好。因此,FragmentD 无法正确显示数据,因为它的生命周期初始化方法(我用来从 FragmentC 获取数据)已经被调用。

我已经尝试设置 pager.setOffscreenPageLimit(0),以强制 ViewPager 始终重建 fragment ,但这是不可能的,因为 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 中所做的选择。但是就像我之前说的,onActivityCreatedonStart 在 FragmentC 初始化时被调用,所以用户还没有选择任何选项,即 choice 始终带有默认值,无论用户选择了哪个选项。

我真的不知道该怎么办...有人有想法吗?

最佳答案

忘记 setOffscreenPageLimit() 并覆盖 setUserVisibleHint(boolean)方法。

检查该方法的参数是否变为真,并使用那里给定的数据更新 UI。

请注意,上述方法已弃用,因此您应该改用 FragmentTransaction.setMaxLifecycle(Fragment, Lifecycle.State)。欲了解更多信息,请访问:

https://developer.android.com/reference/androidx/fragment/app/FragmentTransaction#setMaxLifecycle(androidx.fragment.app.Fragment,%20androidx.lifecycle.Lifecycle.State)

关于android - 防止 ViewPager 始终初始化下一个 fragment (位置 n+1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com