【问题标题】:I am getting crash in my Viewpager when I open the parent fragment for second time当我第二次打开父片段时,我的 Viewpager 崩溃了
【发布时间】:2017-11-03 06:17:04
【问题描述】:

一些信息: 我有一个片段,其中包含一个带有三个片段的 viewpager。当我第一次打开这个片段 viewpager 作品时。我第二次尝试打开这个片段然后它崩溃了以下堆栈跟踪

注意:这发生在 kitkat 以上 19 API 它工作正常

父片段内的 ViewPager 设置代码

private void setupViewPager(ViewPager viewPager) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        adapter = new ViewPagerAdapter(getChildFragmentManager());
    } else {
        adapter = new ViewPagerAdapter(getFragmentManager());
   }
    adapter.addFrag(fragment1 , "Abc");
    adapter.addFrag(fragment2, "Bcd");
    adapter.addFrag(fragment3, "Cdf");

    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(2);

    myTabs.setupWithViewPager(viewPager);
}

我的浏览器适配器

class ViewPagerAdapter extends android.support.v13.app.FragmentPagerAdapter {
    private final List<android.app.Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public android.app.Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }


    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFrag(android.app.Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

这是崩溃堆栈跟踪:

10-14 21:23:47.276 17601-17601/com.d.p E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.d.p, PID: 17601                                                     
java.lang.IllegalStateException: No activity
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1044)
   at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1853)
   at android.app.Fragment.performActivityCreated(Fragment.java:1714)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
   at android.app.BackStackRecord.run(BackStackRecord.java:684)
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
   at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5017)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
   at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

标签: android android-fragments android-viewpager


【解决方案1】:

终于解决了
这是原生片段中的错误,也支持 v4。

当您通过导航抽屉或其他类似的东西选择其他片段时,具有子片段的片段被分离。所以那些子片段的 fragmentManager(getChildFragmentManager()) 不再存在。当这些片段返回时,它会崩溃。

所以基本上我们需要在 onDetach() 中清理 mChildFragmentManager。 因此,只需将下面的代码放在具有嵌套片段的片段中即可。

 @Override
 public void onDetach() {
    try {
        Field childFragmentManager = android.app.Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    super.onDetach();
   }

Source Google issue Tracker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多