Android 如何在Dialog中使用ViewPager - 简书
需求:实现在DialogFragment中添加ViewPager(Fragment)。
问题:出现下面异常 :java.lang.IllegalArgumentException:No view found for id 0x7f10013 for fragment,提示找不到ViewPager的Id ,而且位置是在Fragment中。
原因:ViewPager在创建 PagerAdapter时,PagerAdapter构造函数需要FragmentManager,而FragmentManager既可以通过 getSupportManager(getFragmentManager) 也可以通过getChildFragmentManager得到 ,上面两种方式对应在 Activity中和 Fragment创建 Fragment ,如果使用不当,就会出现上面异常。
容易出bug 地方:
1.Fragment嵌套Fragment如果使用 getFragmentManager
1>Fragment放ViewPager,ViewPager里面是fragment。第一次进入没问题,再次进入ViewPager的fragment时里面内容就没了,数据丢失
2>Fragment低频率点击切换不会发生问题,过快点击马上崩溃
3>错误:java.lang.IllegalArgumentException:No view found for id for fragment
3>调用fragment的replace方法不走onDestroy()、onDestroyView()方法,无法销毁fragment
4>在fragment中写倒计时,每次切换后倒计时越来越快的问题
看下源码:
PagerAdapter adapter = new PagerAdapter(fragmentManager),当实例化Adapter之后,系统会回调 instantiateItem方法,把ViewGroup 的Id 传入进来
@SuppressWarnings("ReferenceEquality")
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 省略部分代码
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
// 这里会往 FragmentManager 里 add 一个 fragment,传入了 container 的id,也就是 ViewGroup 的id
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
return fragment;
}