2013-05-02 15 views
15

Ciao sto ricevendo questo errore durante l'utilizzo di una paginaViwer e adattatore per scorrere su 3 frammenti.java.lang.IllegalStateException: Impossibile modificare il tag del frammento

qui è la mia 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(); 
    } 

ecco come definisco la pagina visualizzata

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

visualizzazione di una pagina ascoltatore

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

    } 

oggetto personalizzato di frammentazione

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

} 
.515.053.691,36321 milioni

completa analisi dello stack di errore:

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) 

risposta

62

E 'probabilmente perché si sta aggiungendo la stessa istanza frammento tre volte alla lista. Dovresti creare una nuova istanza per ogni pagina.

Inoltre, suggerisco di esaminare FragmentStatePagerAdapter se non sei troppo in via di sviluppo. Potrebbe essere una scelta migliore se si desidera aggiornare il contenuto dei frammenti dall'attività principale.

+0

Si prega di consultare la mia domanda correlata: http://stackoverflow.com/questions/24833912/refresh-fragment-ui-from-fragmentactivity –

+0

@CorneliuDascalu quindi l'utilizzo di 'FragmentStatePagerAdapter' risolverebbe il problema? C'è qualcos'altro necessario come come si dovrebbe gestire il 'savedInstanceState'? – ericn

+0

Che errore oscuro ... StackOverflow e utenti straordinari in soccorso ancora una volta! –

0

aver creato un'istanza di SubscribedFragment() della classe

savedListFragment = new SubscribedFragment(); 

e poi superato la lista di questo oggetto nelle ViewPager Adpater:

FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) 

che riceve Lista di tipo frammento nel suo costruttore . Dal momento che il costruttore riceve Lista di tipo Frammento, cercare di gettare ogni savedListFragment in Frammento prima di aggiungere alla lista e poi passarlo al costruttore del adpater:

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

Il seguente metodo dovrebbe restituire un frammento di ogni scheda:

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

il codice va bene, ma assicurarsi che il listFragment contiene tre diversi frammento di, e il frammento non è nullo.

Problemi correlati