java.lang.IllegalStateException: Can't change

2019-01-17 11:52发布

Hi i am getting this error while using a pageViwer and Adapter to slide across 3 fragments.

here is my 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();
    }

here is how i define the pageview

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

page view listener

/*
     * (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);

    }

Custom fragment object

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

}

Full stack trace of error:

    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)

4条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-01-17 12:03

You have created an instance of SubscribedFragment() class

savedListFragment = new SubscribedFragment();

and then you passed the list of this objects into ViewPager Adpater:

FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment)

which receives List of Fragment type in its constructor. Since the constructor receives List of Fragment type, try to cast each savedListFragment into Fragment before you add it to the list and then pass it to the adpater's constructor:

fragmentList.add((Fragment)savedListFragment);
viewPager.setAdapter(new FreedomPageAdapter(fragmentManager(), fragmentList));
查看更多
虎瘦雄心在
3楼-- · 2019-01-17 12:10

It's probably because you're adding the same fragment instance three times to the list. You should create a new instance for each page.

Also, I suggest looking into FragmentStatePagerAdapter if you're not too far into development. It may be a better choice if you want to refresh the content of the fragments from the main activity.

查看更多
祖国的老花朵
4楼-- · 2019-01-17 12:13

In my case, I was not returning a fragment Instance for a particular position. I think FragmentPagerAdapter is receiving null in place of the TAG. That's why it's showing "Can't change tag of fragment" Correct me if I am wrong.

查看更多
可以哭但决不认输i
5楼-- · 2019-01-17 12:22

The following method should return one fragment for each tab:

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

The code is fine, but make sure that the listFragment contains three different Fragment's, and the fragment is not null.

查看更多
登录 后发表回答