2012-08-04 13 views
5

मैं ViewPager + FragmentPagerAdapter. का उपयोग कर टुकड़े मैं वर्तमान में नवीनतम Android समर्थन पैक v4: त्रुटि ViewPager # setCurrentItem() का उपयोग कर

उपयोग कर रहा हूँ स्विच करने के लिए कोशिश कर रहा हूँ "java.lang.IllegalStateException टुकड़ा का टैग नहीं बदला जा सकता"

मेरे पास मेरे ऐप में 5 टैब हैं। जब मैं चौथा टैब चुनता हूं, तो ऐप अचानक निकलता है और कहता है "खंड का टैग बदल नहीं सकता ~~"।

मैंने लेगमेंट को बदलने की कोशिश नहीं की जो लेआउट xml फ़ाइल में शामिल है, इसलिए मैं कारण समझ नहीं पाया।

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

नीचे है FragmentPagerAdapter का टुकड़ा मैं

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

नीचे उपयोग कर रहा हूँ त्रुटि लॉग मैं मुठभेड़ है::

यहाँ कोड जहां त्रुटि उत्पन्न होती है

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) 

अग्रिम धन्यवाद ...

+0

यू अब एक जवाब है? – singhsumit

+1

'सार्वजनिक फ्रैगमेंट getItem (int)' का आपका कार्यान्वयन थोड़ा अजीब लगता है। क्या होगा यदि 'getItem (4) '' getItem (3)' से पहले कहा गया था? मुझे लगता है कि आपको सूची में इंडेक्सऑटऑफबाउंड अपवाद प्राप्त होगा। यह यहां नहीं हो रहा है, लेकिन आप थोड़ा अलग दृष्टिकोण पर विचार कर सकते हैं और समस्या को ठीक कर सकते हैं। – mkasberg

उत्तर

4

मुझे getCount विधि को गलत तरीके से कार्यान्वित करते समय एक ही अपवाद का अनुभव हुआ है। क्या आपने जांच की है कि सही आकार वापस आ गया है या नहीं?

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

मुझे इसके साथ भी समस्याएं थीं, जो कि एक बेमेल 'सार्वजनिक int getCount() 'के रूप में सामने आया, जैसा कि बोगदान ने सुझाव दिया था। – mkasberg

1

मैं देख रहा हूँ कि यह एक हो गया है, जबकि आप इस प्रश्न पूछा लेकिन भविष्य उपयोगकर्ता के लिए जो इस मुद्दे को भी सामना करना पड़ सकता है ...

मैं कुछ उपकरणों पर ठीक उसी त्रुटि हो रही थी, और मैं नहीं कर सका जब तक मैं @ mkasberg की टिप्पणी नहीं देखता तब तक कोई रीसास ढूंढें ... किसी भी तरह से इटैम विधि को क्रम में नहीं बुलाया जा सकता है, शायद क्योंकि कुछ डिवाइस तेजी से प्रक्रिया करते हैं या मुझे नहीं पता है, लेकिन सरणी के बजाय sparseArray का उपयोग करके मेरी समस्या हल हो गई है। धन्यवाद!

और यहाँ आप इसे कैसे कर सकता है:

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

    return sparseArray.get(i); 
}