java.lang.IllegalStateException : Fragment already active

标签 java android android-fragments android-viewpager

我正在使用 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/

相关文章:

java - 我可以将对象类型作为@WebMethod 的参数吗?

java - 公共(public) JAR 是否必须在 EAR 中的 WAR 中重复?

java - 如何在 hibernate 验证之前开始 Flyway 迁移?

java - Android - 试图实例化一个不是 fragment 的类

java - 如何获得折叠工具栏布局的最大垂直偏移

java - 如何使用 swipeRefreshLayout 更新 fragment 中的新 json 数据

java - 使用 PDF 渲染器打开后无法删除 pdf 文件

Android BackupManager和与同一帐户关联的多个设备

android - 为什么我的 Android 应用程序占用过多内存?

android - 如何知道 Lottie 动画何时完成?