Android 空的ViewPager与PagerTabStrip一起崩溃

Android 空的ViewPager与PagerTabStrip一起崩溃,android,android-widget,Android,Android Widget,将ViewPager与PagerTabStrip一起使用时: <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="fill_parent" an

ViewPager
PagerTabStrip
一起使用时:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

<android.support.v4.view.PagerTabStrip
    android:id="@+id/pager_tab_strip"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:paddingTop="4dp"
    android:paddingBottom="4dp"
    />

</android.support.v4.view.ViewPager>
触摸/滚动选项卡条时应用程序崩溃:

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
        at java.util.ArrayList.get(ArrayList.java:304)
        at android.support.v4.view.ViewPager.performDrag(ViewPager.java:1990)
我想可能是原因

“我的视图”设置是否存在错误或其他问题?

在不进行任何检查的情况下访问阵列中的项目(当没有页面时):


这导致它崩溃

这个错误仍然没有修复,因为我遇到了同样的问题。 问题在于android ViewPager类中的performDrag(float x)方法中有两行代码:

如果mItems Arraylist是否为空,则根本不进行检查。 对于Android团队来说,这应该不难解决

然而,我想出了一个快速而肮脏的解决方案,我不建议使用。 只需创建您自己的类扩展ViewPager并重写该方法,该方法将产生崩溃并用try,catch块将其包围:

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean event = false;
        try {
            event = super.onInterceptTouchEvent(ev);
        } catch (Exception e) {
            Log.e(MainActivity.TAG, "ERROR: ViewPagerAdapter was empty");
        }
        return event;
    }
}
使用try,catch块作为程序逻辑是不好的做法,但是在android团队修复这个bug之前,这是唯一对我有效的解决方案

编辑:

不要忘记在XML中引用自定义的ViewPager:

<com.package.CustomViewPager
    android:id="@+id/viewPager_fragment_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <android.support.v4.view.PagerTabStrip
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</com.package.CustomViewPager>


只是猜测-尝试在getCount()中返回1,在getItem()中返回有效片段。顺便说一句,PagerTabStrip的宽度应该是fill\u parents你能解决这个问题吗?@DeRagan这个错误在支持库中,所以谷歌开发者需要解决它。它很容易只捕获
索引自动边界异常
。或者在调用超级之前检查大小,根本不使用异常
final ItemInfo firstItem = mItems.get(0);
final ItemInfo lastItem = mItems.get(mItems.size() - 1);
public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean event = false;
        try {
            event = super.onInterceptTouchEvent(ev);
        } catch (Exception e) {
            Log.e(MainActivity.TAG, "ERROR: ViewPagerAdapter was empty");
        }
        return event;
    }
}
<com.package.CustomViewPager
    android:id="@+id/viewPager_fragment_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <android.support.v4.view.PagerTabStrip
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</com.package.CustomViewPager>