2012-08-04 6 views
5

Ich versuche Fragmente zu wechseln mit ViewPager + FragmentPagerAdapter. Ich bin derzeit die neueste Android Support Pack v4 mit: error "java.lang.IllegalStateException kann nicht Tag des Fragments ändern", wenn ViewPager # setCurrentItem() verwendet

Ich habe 5 Tabs in meiner App. Wenn ich die 4. Registerkarte wähle, wird die App plötzlich beendet und sagt: "Ich kann das Fragment nicht ändern ~~".

Ich habe nicht versucht, das Fragment zu ersetzen, das in der XML-Layoutdatei enthalten ist, so dass ich die Ursache nicht herausfinden konnte. Hier

ist der Code, wo der Fehler auftritt:

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

unten Fragment von FragmentPagerAdapter Ich verwende

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

Im Folgenden wird das Fehlerprotokoll I auftreten:

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) 

Vielen Dank im Voraus ...

+0

u tun haben, eine jetzt Antwort? – singhsumit

+1

Ihre Implementierung von 'public Fragment getItem (int)' scheint etwas seltsam zu sein. Was würde passieren, wenn 'getItem (4)' vor 'getItem (3)' aufgerufen wurde? Ich könnte mir vorstellen, dass Sie eine IndexOutOfBoundsException auf der Liste erhalten. Das passiert hier nicht, aber Sie könnten einen etwas anderen Ansatz erwägen und das Problem beheben. – mkasberg

Antwort

4

Ich habe die gleiche Ausnahme bei falscher Implementierung der getCount-Methode erlebt. Haben Sie überprüft, ob die richtige Größe zurückgegeben wird?

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

Ich hatte auch Probleme mit dieser, die sich als eine nicht übereinstimmende 'public int getCount()' herausstellte, wie Bogdan vorgeschlagen hat. – mkasberg

1

Ich sehe, dass es eine gewesen ist, während Sie diese Frage gestellt, aber für zukünftige Benutzer, auch dieses Problem konfrontiert sein könnten ...

ich auf einigen Geräten exakt die gleichen Fehler hatte, und ich konnte nicht finde irgendeinen Reasone, bis ich den @ mkasberg-Kommentar sehe ... Irgendwie kann getItem-Methode nicht in Reihenfolge aufgerufen werden, vielleicht weil einige Geräte schneller arbeiten oder ich weiß es nicht, aber die Verwendung von sparseArray anstelle von arrayList hat mein Problem gelöst. Danke!

Und hier, wie Sie es tun könnte:

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

    return sparseArray.get(i); 
}