使用ViewPager報錯java.lang.IllegalStateException: The specified child already has a parent. You must ...

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.java

不知道你們在使用ViewPager的時候有沒有碰到過這個問題, 反正我是碰到了,因此作個記錄,但願對之後有用ide

  從字面上看,就是說子view已經有了一個父控件,因此你得先把父控件remove掉.  由於每個子view 只能擁有一個父控件,可是當你滑動viewpager的時候,在PagerAdapter中的 instantiateItem 方法就會重複執行,這時候就會屢次添加父控件,因此若是不作處理,就會報這個錯.code

    因此個人處理就是在用到public class MyPagerAdapter extends PagerAdapter 的時候,在他的instantiateItem方法中,先獲取到父控件,判空下圖片

@Override
	public Object instantiateItem(ViewGroup container, int position) {
		ImageView mImageView = new ImageView(context);
		// 設置圖片根據imageView來將圖片進行拉伸
		mImageView.setScaleType(ScaleType.FIT_XY);
		ViewGroup parent = (ViewGroup) mImageView.getParent();
		if (null != parent) {
			parent.removeAllViews();
		}
		// 當前頁面爲第幾頁(60000頁) 而後除以集合的長度 取餘數就是當前頁面在list集合中對應圖片的位置
		mImageView.setImageResource(list.get(position % list.size()).getIconId());
		container.addView(mImageView);
		return mImageView;
	}

 

而且在每個fragment的onCreateView中,都作了下面的處理ci

@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		if (null == view ) {
			view = inflater.inflate(R.layout.fragment5, container, false);
		} else {
			ViewGroup parent = (ViewGroup) view.getParent();
			if (null != parent) {
				parent.removeAllViews();
			}
		}
		
		 initView(view);
		 return view;
	}

 這樣就不會報那個錯了~~rem

相關文章
相關標籤/搜索