gpt4 book ai didi

android - 当我第二次打开父 fragment 时,我的 Viewpager 崩溃了

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:40:57 24 4
gpt4 key购买 nike

一些信息:我有一个 fragment ,其中包含一个包含三个 fragment 的 viewpager。当我第一次打开这个 fragment 时,viewpager 起作用了。第二次我尝试打开此 fragment 然后它崩溃并显示以下堆栈跟踪

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

父 fragment 中的 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);
}

我的 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)

最佳答案

终于解决了
这是native fragments的bug,也支持v4。

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

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

 @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

关于android - 当我第二次打开父 fragment 时,我的 Viewpager 崩溃了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46746555/

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