Fragment 中嵌入fragment切换页面报错

为了不弄混淆:暂且把Activity中嵌入的Fragment叫做Fragment1,Fragment2。嵌入在Fragment1中的Fragment叫Fragment11

遇到问题:
打开软件时,显示Fragment1,切换到Fragment2,再切换回Fragment1时报错。

报错信息如下:

W/System.err(20601): android.view.InflateException: Binary XML file line #10: Error inflating class fragment
W/System.err(20601):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
W/System.err(20601):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
W/System.err(20601):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
W/System.err(20601):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
W/System.err(20601):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
W/System.err(20601):    at com.sdlj.vehiclerepair.fragment.HomeFragment.onCreateView(HomeFragment.java:75)
W/System.err(20601):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2239)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1332)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1574)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1641)
W/System.err(20601):    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:794)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2415)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2153)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2063)
W/System.err(20601):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:725)
W/System.err(20601):    at android.os.Handler.handleCallback(Handler.java:800)
W/System.err(20601):    at android.os.Handler.dispatchMessage(Handler.java:100)
W/System.err(20601):    at android.os.Looper.loop(Looper.java:194)
W/System.err(20601):    at android.app.ActivityThread.main(ActivityThread.java:5398)
W/System.err(20601):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(20601):    at java.lang.reflect.Method.invoke(Method.java:525)
W/System.err(20601):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
W/System.err(20601):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
W/System.err(20601):    at dalvik.system.NativeStart.main(Native Method)
W/System.err(20601): Caused by: java.lang.IllegalArgumentException: Binary XML file line #10: Duplicate id 0x7f0c0092, tag null, or parent id 0xffffffff with another fragment for com.sdlj.vehiclerepair.view.CycleViewPager
W/System.err(20601):    at android.app.Activity.onCreateView(Activity.java:4786)
W/System.err(20601):    at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:41)
W/System.err(20601):    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75)
W/System.err(20601):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
W/System.err(20601):    ... 24 more

解决方案:

1.在Fragment1中将View定义为静态,判断是否为空。这种方法虽然能解决问题,但是有内存泄露

private static View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
            parent.removeView(view);
    }
    try {
        view = inflater.inflate(R.layout.map, container, false);
    } catch (InflateException e) {
        /* map is already there, just return view as it is */
    }
    return view;
}

2.在Fragment1的onDestroyView中将Fragment11手动删除,再进入的时候再重新加载。

@Override
public void onDestroyView() {
    super.onDestroyView();
    Fragment11 f = (Fragment11) getActivity().getFragmentManager()
                                         .findFragmentById(R.id.map);
    if (f != null) 
        getActivity().getFragmentManager().beginTransaction().remove(f).commit();
}

更详细的解释请见:https://stackoverflow.com/questions/14083950/duplicate-id-tag-null-or-parent-id-with-another-fragment-for-com-google-androi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值