我正在使用 ViewPager 和 fragment 创建一个演练 Activity ,我已经能够成功创建演练,但问题是,我只能滑动到前面,如果我尝试向后滑动应用程序崩溃,我尝试在另一个测试应用程序上复制它,该测试应用程序在正面和背面都工作得很好,尽管那个应用程序使用 TextView,而这个使用 ImageView。
我需要帮助找出为什么它在向后滑动时崩溃。
public class WalkThroughActivity extends AppCompatActivity {
ViewPager mPager;
LinearLayout mLinearLayout;
CustomPagerAdapter mAdapter;
MyPageIndicator mIndicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_walk_through);
mPager = (ViewPager) findViewById(R.id.pager);
mLinearLayout = (LinearLayout) findViewById(R.id.pagesContainer);
List < Fragment > fragments = new ArrayList < >();
fragments.add(ContentFragment.newInstance(R.drawable.walkthrough_card_1));
fragments.add(ContentFragment.newInstance(R.drawable.walkthrough_card_2));
fragments.add(ContentFragment.newInstance(R.drawable.walkthrough_card_3));
mAdapter = new CustomPagerAdapter(getSupportFragmentManager(), fragments);
mPager.setAdapter(mAdapter);
mIndicator = new MyPageIndicator(this, mLinearLayout, mPager, R.drawable.indicator_circle);
mIndicator.setPageCount(fragments.size());
mIndicator.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
mIndicator.cleanup();
}
static class CustomPagerAdapter extends FragmentStatePagerAdapter {
List < Fragment > mFrags = new ArrayList < >();
public CustomPagerAdapter(FragmentManager fm, List < Fragment > frags) {
super(fm);
mFrags = frags;
}
@Override
public Fragment getItem(int position) {
int index = position % mFrags.size();
return mFrags.get(index);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
}
内容 fragment
public class ContentFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private int mParam1;
public ContentFragment() {
// Required empty public constructor
}
public static ContentFragment newInstance(int param1) {
ContentFragment fragment = new ContentFragment();
Bundle args = new Bundle();
args.putInt(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getInt(ARG_PARAM1);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.indicator_fragment, container, false);;
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
imageView.setImageResource(mParam1);
return view;
}
public int getmParam1() {
return mParam1;
}
}
错误日志
FATAL EXCEPTION: main
Process: com.simpumind.shoopa, PID: 8207
java.lang.IllegalStateException: Fragment already active
at android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:576)
at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:114)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1216)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:273)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:603)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
最佳答案
我认为有问题的代码行是
@Override
public Fragment getItem(int position) {
int index = position % mFrags.size();
return mFrags.get(index);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
我不确定你想要实现什么,但这段代码非常糟糕。它使 ViewPager
相信您拥有的 fragment 比实际拥有的多得多,并且多次重复使用相同的 fragment 。假设 mFrags.size() 为 2 并且 ViewPager 请求 #0、#1 和 #2 - 您将返回 fragment #0 两次,并且 ViewPager 可能会尝试两次通过生命周期传递同一个 fragment 。这种 fragment 的重用很可能是您看到的异常的根源。
顺便问一下,直接有什么问题吗?
@Override
public Fragment getItem(int position) {
return mFrags.get(position);
}
@Override
public int getCount() {
return mFrags.size();
}
关于java.lang.IllegalStateException : Fragment already active,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42822554/