2013-05-02 110 views
15

您好,我在使用pageViwer和Adapter跨3個片段時出現此錯誤。java.lang.IllegalStateException:無法更改片段的標記

這裏是我的pageAdapter

public class FreedomPageAdapter extends FragmentPagerAdapter { 

    private List<Fragment> listFragment; 


    public FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) { 

     super(fm); 
     this.listFragment = listFragment; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
    */ 
    @Override 
    public Fragment getItem(int position) { 
     // TODO Auto-generated method stub 
     return listFragment.get(position); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.view.PagerAdapter#getCount() 
    */ 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return listFragment.size(); 
    } 

這裏是我如何定義瀏覽量

viewPager = (ViewPager) findViewById(R.id.pager); 

     viewPager.setOnPageChangeListener(this); 

     savedListFragment = new SubscribedFragment(); 

     fragmentList.add(savedListFragment); 

     fragmentList.add(savedListFragment); 

     fragmentList.add(savedListFragment); 

     viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(), 
       fragmentList)); 



    private FragmentManager fragmentManager() { 
     return getSupportFragmentManager(); 
    } 

    private FragmentTransaction getFragmentTransaction() { 
     return fragmentManager().beginTransaction(); 
    } 

頁面視圖聽衆

/* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.view.ViewPager.OnPageChangeListener# 
    * onPageScrollStateChanged(int) 
    */ 
    @Override 
    public void onPageScrollStateChanged(int arg0) { 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled 
    * (int, float, int) 
    */ 
    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected 
    * (int) 
    */ 
    @Override 
    public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 

    } 

定製的片斷對象

public class SubscribedFragment extends Fragment{ 

    /* (non-Javadoc) 
    * @see android.app.Fragment#onCreate(android.os.Bundle) 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

    } 

    /* (non-Javadoc) 
    * @see android.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     return inflater.inflate(R.layout.discussion_list_layout, container); 
    } 

} 
錯誤

完整堆棧跟蹤:

05-02 19:15:44.599: E/AndroidRuntime(19839): FATAL EXCEPTION: main 
05-02 19:15:44.599: E/AndroidRuntime(19839): java.lang.IllegalStateException: Can't change tag of fragment SubscribedFragment{41157420 id=0x7f070005 android:switcher:2131165189:0}: was android:switcher:2131165189:0 now android:switcher:2131165189:1 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:398) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:389) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:99) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:800) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.populate(ViewPager.java:991) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.populate(ViewPager.java:880) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2434) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.View.measure(View.java:15518) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer.doFrame(Choreographer.java:532) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.os.Handler.handleCallback(Handler.java:725) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.os.Looper.loop(Looper.java:137) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at android.app.ActivityThread.main(ActivityThread.java:5226) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at java.lang.reflect.Method.invokeNative(Native Method) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at java.lang.reflect.Method.invoke(Method.java:511) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-02 19:15:44.599: E/AndroidRuntime(19839): at dalvik.system.NativeStart.main(Native Method) 

回答

62

這可能是因爲你要添加的相同片段實例三次到列表中。您應該爲每個頁面創建一個新實例。

此外,我建議您查看FragmentStatePagerAdapter,如果您不太深入發展。如果要刷新主要活動中片段的內容,這可能是更好的選擇。

+0

請參閱我的相關問題:http://stackoverflow.com/questions/24833912/refresh-fragment-ui-from-fragmentactivity – 2014-07-19 08:04:43

+0

@CorneliuDascalu所以使用'FragmentStatePagerAdapter'會解決這個問題嗎?還有其他必要的東西,比如應該如何處理'savedInstanceState'? – ericn 2017-02-05 06:30:16

+0

什麼是晦澀的錯誤... StackOverflow&真棒用戶再次拯救! – 2018-02-14 14:30:15

0

您已經創建SubscribedFragment()類

savedListFragment = new SubscribedFragment(); 

的一個實例,然後你通過列表​​的這個對象到ViewPager Adpater:它在其構造函數接收片段式的列表

FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) 

。由於構造函數接收片段式的列表,儘量每個savedListFragment投爲碎片將其添加到列表之前,然後把它傳遞給adpater的構造函數:

fragmentList.add((Fragment)savedListFragment); 
viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(), fragmentList)); 
5

下面的方法應該返回一個片段爲每個標籤:

@Override 
public Fragment getItem(int position) { 
    //Add some code 
    //to verify that it will not return null 
    return listFragment.get(position); 
} 

代碼很好,但要確保listFragment包含三個不同的Fragment,並且該片段不爲空。