2013-05-02 6 views
15

Hallo, ich bekomme diesen Fehler, wenn ich einen PageViewer und Adapter verwende, um über 3 Fragmente zu gleiten.java.lang.IllegalStateException: Tag des Fragments kann nicht geändert werden

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

hier ist, wie ich den Seitenzugriff

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

Seitenansicht Zuhörer

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

    } 

Benutzerdefinierte Fragment-Objekt

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

} 
definieren

Voll Stack-Trace-Fehler:

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) 

Antwort

62

Es ist wahrscheinlich, weil Sie das gleiche Fragment Beispiel dreimal in die Liste sind. Sie sollten für jede Seite eine neue Instanz erstellen.

Auch schlage ich vor, in FragmentStatePagerAdapter zu suchen, wenn Sie nicht zu weit in Entwicklung sind. Es ist möglicherweise eine bessere Wahl, wenn Sie den Inhalt der Fragmente aus der Hauptaktivität aktualisieren möchten.

+0

Bitte lesen Sie meine verwandte Frage: http://StackOverflow.com/Questions/24833912/refresh-fragment-ui-from-fragmentactivity –

+0

@CorneliuDascalu so mit 'FragmentStatePagerAdapter' würde das Problem lösen? Gibt es noch etwas anderes, wie man mit dem 'savedInstanceState' umgehen sollte? – ericn

+0

Was für ein undurchsichtiger Fehler ... StackOverflow & geniale Benutzer zur Rettung noch einmal! –

0

Sie haben eine Instanz von SubscribedFragment() Klasse

savedListFragment = new SubscribedFragment(); 

und dann übergeben Sie die Liste dieser Objekte in ViewPager Adpater erstellt:

FreedomPageAdapter(FragmentManager fm, List<Fragment> listFragment) 

, die in seinem Konstruktor Liste der Fragment-Typ empfängt . Da der Konstruktor Liste der Fragment-Typ empfängt, versuchen, jede savedListFragment in Fragment zu werfen, bevor Sie es in die Liste aufnehmen und es dann an den Konstruktor des Adpater:

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

Das folgende Verfahren ein Fragment für jeden Reiter zurückkehren sollte:

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

der Code ist in Ordnung, aber sicher, dass die listFragment drei verschiedene Fragment des enthält, und das Fragment ist nicht null.

Verwandte Themen