ViewPager vacío se bloquea con PagerTabStrip
Cuando se utiliza ViewPager
con 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>
Con paginador que tiene un adaptador vacío:
- Permitir a los usuarios introducir un nuevo valor en Spinner
- ¿Cómo configurar AutoCompleteTextView desplegable fondo transparente en Android?
- Java.lang.RuntimeException: servidor del sistema muerto?
- Crea una barra lateral como el navegador Dolphin o Firefox en android
- Android EditarTexto Fondo transparente
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewPager pager = (ViewPager) findViewById(R.id.pager); FragmentPagerAdapter adapter = new FragmentPagerAdapter(getFragmentManager()) { @Override public CharSequence getPageTitle(int position) { return "test"; } @Override public Fragment getItem(int i) { return null; } @Override public int getCount() { return 0; } }; pager.setAdapter(adapter); }
La aplicación se bloquea al tocar / desplazar la barra de pestañas:
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)
Creo que esta línea en ViewPager.performDrag()
podría ser la causa.
¿Es un error o algo malo con mi configuración de vista?
- Vista de texto de Autocompletar de Twitter como Android
- Colocar ViewPager como una fila en ListView
- El elemento de la vista de cuadrícula no se ilumina cuando se pulsa
- Implementación de una vista de lista dentro de un cajón deslizante con una vista de lista ya presente
- Spinner - enfoque al primer artículo
- ¿Cómo iniciar una actividad desde un widget de lockscreen, sin desbloquear?
- Desactivación de SearchView
- Actualización de Android TextView regularmente para mostrar la cuenta atrás
En ViewPager
se accede a los elementos de la matriz de código sin ninguna comprobación (cuando no hay ninguna página):
final ItemInfo firstItem = mItems.get(0); final ItemInfo lastItem = mItems.get(mItems.size() - 1);
Esto hace que se bloquee.
Este error aún no está fijo, ya que encontré el mismo problema. El problema son estas dos líneas en la clase ViewPager de Android, en el método performDrag (float x):
final ItemInfo firstItem = mItems.get(0); final ItemInfo lastItem = mItems.get(mItems.size() - 1);
No hay cheques en absoluto, si el artilugio de mItems está vacío o no. Esto no debería ser difícil de solucionar para el equipo de Android …
Sin embargo, vine con una solución rápida y sucia que no sugeriría usar. Simplemente haga su propia clase extendiendo ViewPager y anule el método, que produce el fallo y lo rodea con un bloque 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; } }
Es una mala práctica usar try, catch blocks para la lógica del programa, pero hasta que el equipo de android corrija este bug, esta es la única solución que funcionó para mí.
EDITAR:
No olvide hacer referencia a su ViewPager personalizado en el XML:
<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>