今天在开发的时候,在使用一个自定义的ViewPager的时候,程序出现了如下的错误:
android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class com.android.app.view.DispatchViewPager
详细报错如下图:
而我的出错代码如下:
自定义ViewPager:
public class DispatchViewPager extends ViewPager{
public DispatchViewPager(Context context){
super(context);
}
private DispatchTouch dispatchTouch;
public interface DispatchTouch{
void dispatch(MotionEvent ev);
}
public void setDispatchTouch(DispatchTouch d){
dispatchTouch = d;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(dispatchTouch != null){
dispatchTouch.dispatch(ev);
}
return super.dispatchTouchEvent(ev);
}
}
xml中的引用:
<com.android.app.view.DispatchViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
上面的代码就会报这样的bug:Error inflating class com.android.app.view.DispatchViewPager,后来经过尝试,发现了这个bug的解决方法:在自己的自定义View中加入如下代码:
public DispatchViewPager(Context context,AttributeSet paramAttributeSet) {
super(context,paramAttributeSet);
}
也就是带AttributeSet属性的构造函数。
完整自定义代码如下代码如下:
public class DispatchViewPager extends ViewPager{
public DispatchViewPager(Context context){
super(context);
}
public DispatchViewPager(Context context,AttributeSet paramAttributeSet) {
super(context,paramAttributeSet);
}
private DispatchTouch dispatchTouch;
public interface DispatchTouch{
void dispatch(MotionEvent ev);
}
public void setDispatchTouch(DispatchTouch d){
dispatchTouch = d;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(dispatchTouch != null){
dispatchTouch.dispatch(ev);
}
return super.dispatchTouchEvent(ev);
}
}
总结:在出现了如上的bug之后,我们需要在自定义VIew中添加DispatchViewPager(Context context,AttributeSet paramAttributeSet) 构造函数即可。这应该是如上报错的一种解决方式,大家可以尝试一下~