2012-08-04 15 views
5

sto cercando di cambiare Frammenti utilizzando ViewPager + FragmentPagerAdapter. Attualmente sto usando l'ultimo supporto di Android pacchetto v4"java.lang.IllegalStateException: Impossibile cambiare tag del frammento" l'errore quando si utilizza ViewPager # setCurrentItem()

Ho 5 schede nella mia app. Quando seleziono la quarta scheda, l'app si chiude improvvisamente e dice "non è possibile modificare il tag del frammento ~~".

Non ho provato a sostituire il frammento che è incluso nel file di layout xml, quindi non ho potuto capire la causa.

ecco il codice in cui l'errore si verifica:

@Override 
public void onTabSelected(ActionBar.Tab tab, 
     FragmentTransaction fragmentTransaction) { 
    // When the given tab is selected, switch to the corresponding page in 
    // the ViewPager. 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

Di seguito è frammento di FragmentPagerAdapter sto usando

@Override 
    public Fragment getItem(int i) { 
     if (fragment_list.get(i) == null) { 
      fragment_list.add(i, getFragment(i)); 
     } 

     return fragment_list.get(i); 
    } 

    private Fragment getFragment(int index) { 
     switch (index) { 
     case TOP: 
      return UseCaseListWithOptionFragment.newInstance(
        URLHelper.USE_CASES_TOP_URL, R.array.comment); 
     case FEED: 
      int user_id = UserHelper.getCurrentUser(MainActivity.this).id; 
      return UseCaseListFragment.newInstance(
        URLHelper.getMyFeedsURL(user_id), true); 
     case RECENT: 
      return UseCaseListFragment.newInstance(
        URLHelper.USE_CASES_RECENT_URL, true); 
     case CATEOGORY: 
      return UseCaseGroupListFragment.newInstance(
        URLHelper.USE_CASE_GROUPS_URL, R.array.use_case); 
     case MY: 
      return UserProfileFragment.newInstance(UserHelper 
        .getCurrentUser(MainActivity.this)); 
     default: 
      throw new IllegalStateException("Tab index out of bound."); 
     } 
    } 

    @Override 
    public int getCount() { 
     return TAB_COUNT; 
    } 

Di seguito il log degli errori che incontro:

08-04 17:51:55.983: E/AndroidRuntime(1112): FATAL EXCEPTION: main 
08-04 17:51:55.983: E/AndroidRuntime(1112): java.lang.IllegalStateException: Can't change tag of fragment UseCaseGroupListFragment{4055f558 id=0x7f050034 android:switcher:2131034164:3}: was android:switcher:2131034164:3 now android:switcher:2131034164:4 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:356) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:347) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:99) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:692) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.view.ViewPager.populate(ViewPager.java:875) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:469) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:441) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:422) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at org.everyuse.android.activity.MainActivity.onTabSelected(MainActivity.java:176) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at com.actionbarsherlock.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:526) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at com.actionbarsherlock.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:907) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at com.actionbarsherlock.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java:503) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.view.View.performClick(View.java:2485) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.view.View$PerformClick.run(View.java:9080) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.os.Handler.handleCallback(Handler.java:587) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.os.Looper.loop(Looper.java:123) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at java.lang.reflect.Method.invoke(Method.java:507) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
08-04 17:51:55.983: E/AndroidRuntime(1112):  at dalvik.system.NativeStart.main(Native Method) 

Grazie in anticipo ...

+0

do u hanno una risposta ora? – singhsumit

+1

L'implementazione di 'framment getItem pubblico (int)' sembra un po 'strana. Cosa accadrebbe se 'getItem (4)' fosse chiamato prima di 'getItem (3)'? Immagino che otterresti una IndexOutOfBoundsException sulla lista. Non sta succedendo qui, ma potresti considerare un approccio leggermente diverso e finire per risolvere il problema. – mkasberg

risposta

4

Ho riscontrato la stessa eccezione quando implementavo in modo errato il metodo getCount. Hai controllato se viene restituita la taglia corretta?

@Override 
public int getCount() { 
    return 5; 
} 
+0

Ho anche avuto problemi con ciò che si è rivelato essere un 'getcount() pubblico non corrispondente, come suggerito da bogdan. – mkasberg

1

vedo che è stato un po 'lei ha chiesto questa domanda, ma per l'utente futuro che potrebbe affrontare questo problema anche ...

Stavo facendo lo stesso errore esatto su alcuni dispositivi, e non ho potuto trova qualche errore finché non vedo il commento di @ mkasberg ... In qualche modo, il metodo getItem potrebbe non essere richiamato, forse perché alcuni dispositivi elaborano più velocemente o non lo so, ma l'utilizzo di sparseArray invece di arrayList ha risolto il mio problema. Grazie!

Ed ecco come si potrebbe fare:

public Fragment getItem(int i) { 
    if (sparseArray.get(i) == null) { 
     sparseArray.put(i, getFragment(i)); 
    } 

    return sparseArray.get(i); 
} 
Problemi correlati