2013-01-21 11 views
5

Quando si utilizza un ViewPager con PagerTabStrip:vuoto ViewPager si blocca 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 cercapersone avere un adattatore vuoto:

@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); 

} 

App si blocca sul toccando/scorrendo la Striscia Tab:

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) 

I thinkthis line in ViewPager.performDrag() potrebbe essere la causa.

Si tratta di un errore o di qualcosa di sbagliato nella configurazione della vista?

+0

solo una supposizione - cercare di tornare in 1 getCount() e un frammento valido getItem(). A proposito, la larghezza di PagerTabStrip dovrebbe essere fill_parent – auval

risposta

3

In ViewPager code elementi di matrice sono accessibili senza alcun controllo (quando non c'è pagina):

final ItemInfo firstItem = mItems.get(0); 
final ItemInfo lastItem = mItems.get(mItems.size() - 1); 

Questo fa sì che il crash.

+0

sei riuscito a risolvere questo problema? – DeRagan

+0

@DeRagan Il bug è nella libreria di supporto, quindi gli sviluppatori di Google devono risolverlo. –

+0

È già risolto? –

0

Questo errore non è ancora stato risolto poiché ho riscontrato lo stesso problema. Il problema sono queste due linee nella android classe ViewPager, nella performDrag (float x) Metodo:

final ItemInfo firstItem = mItems.get(0); 
final ItemInfo lastItem = mItems.get(mItems.size() - 1); 

ci sono controlli affatto, se il mItems Arraylist è vuoto o meno. Questo non dovrebbe essere difficile da risolvere per il team di Android ...

Tuttavia mi è venuta in mente una soluzione rapida e sporca che non suggerirei di utilizzare. Basta fare la propria classe che estende ViewPager e l'override del metodo, che produce l'incidente e la circondano con un tentativo, blocco 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; 
    } 
} 

E 'cattiva pratica utilizzare provare, blocchi di cattura per la logica del programma, ma finché il team di Android non risolverà questo errore, questa è l'unica soluzione che ha funzionato per me.

EDIT:

Non dimenticare di fare riferimento vostra abitudine ViewPager in 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> 
+1

Sarebbe opportuno prendere solo "IndexOutOfBoundsException". –

Problemi correlati