今天在使用ViewPager的时候遇到了这个异常,以前知道怎么解决但是没有仔细的看过为什么出现这种情况下面做出一些分析。
1、viewpager就好像一个容器,装着你想要展示的内容,比如imageview,fragment等等,这里用imageview来举例,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/vp_imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fi"
android:src="@mipmap/page_01" />
</RelativeLayout>
我这里用的就是这个layout文件来充当viewpager的显示内容,不难看出imageview已经有了一个父控件RelativeLayout 当我们在
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(views[position]);
return views[position];
}
这个里面调用container.addView(views[position]);的时候就相当于把imageview再次添加了一个父view这在android里面是不允许的。
这种情况解决方法有两个:
1、在xml文件里面将imageview的父容器去掉,
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vp_imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@mipmap/page_01" />
2、在instantiateItem方法中进行判断,将imageview从原来的父容器中进行删除
if (views[position].getParent() != null) {
ViewGroup viewGroup = (ViewGroup) views[position].getParent();
viewGroup.removeAllViews();
}
container.addView(views[position]);
return views[position];
做一下判断,如果imageview原来有父容器,则把imageview从原来的父容器中删除掉,如果没有的话就直接addview
网友评论