2013-05-02 109 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,并且该片段不为空。