6

Dies wird die letzte Frage, die ich über Tabs habe, ich verspreche :) (vielleicht) Also von früheren Fragen und versuchen und Fehler habe ich FragmentPagerAdapter namens PagerAdapter, die ein paar Tabs erstellt und gibt auch mir die Möglichkeit, neue Tabs dynamisch zu erstellen. Das Problem ist, dass die neue Tabs immer rechts von meinem vorhandenen Tabs eingefügt erhalten:Fügen Sie Tabs auf der linken Seite mit FragmentPagerAdapter

(Bild: http://s7.directupload.net/file/d/3198/73dyzvzv_png.htm

habe ich versucht, den folgenden:

  1. einen statischen Eintrag hinzufügen von " NULL "das würde beim Erstellen der ersten Gruppe von Tabs übersprungen werden. Später beim Erstellen von" Temp Tab "konnte ich diesen Eintrag zu dem gewünschten Fragment überschreiben. Gab mir eine seltsame IllegalSTateException ...

  2. Die Sache dachte, ich wäre die beste Arbeit und wollte eigentlich wirklich schlecht arbeiten: Anstelle der Zugabe Fragmente mit:

    private final List<Fragment> mFragments = new ArrayList<Fragment>(); 
    
    public void addFragment(Fragment fragment) { 
        mFragments.add(fragment); 
        notifyDataSetChanged(); 
    } 
    

verwenden
mFragments.add(0, fragment); 

Aber es gibt einen Illegal mit der Meldung :

Can't change tag of fragment ChatFragment 

Wenn ich versuche, das Temp-Fragment hinzuzufügen. nun zwei Fragen:

  1. Gibt es eine Möglichkeit, um dieses Fragment Tab, kann ich alle Fragment-Tags für einen Moment wegzunehmen und wieder aufzubauen, sie alle, oder was? Oder

  2. Gibt es eine viel bessere und elegante Möglichkeit, dies zu tun? Oder sollte ich gerade meine UI so umgestalten, dass der Tab rechts verwendet werden kann? : P

EDIT: Hier einige Code: (ich nie schreiben will nur eine Wand des Todes Menschen, weil es ihnen abschrecken könnte: o)

FragmentPagerAdapter:

public class PagerAdapter extends FragmentPagerAdapter { 

    private Context mContext; 

    public PagerAdapter(FragmentManager fm, Context context) { 
    super(fm); 
    mContext = context; 
    } 

    private final List<Fragment> mFragments = new ArrayList<Fragment>(); 
    public void addFragment(Fragment fragment) { 
    mFragments.add(fragment); 
    notifyDataSetChanged(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
    return mFragments.get(position); 
    } 

    @Override 
    public int getCount() { 
    return mFragments.size(); 
    } 

    @Override 
    public String getPageTitle(int position) { 

    switch (position) { 
    case 0: 
     return mContext.getString(R.string.tab_title_chats); 
    case 1: 
     return mContext.getString(R.string.tab_title_contacts); 
    case 2: 
     return mContext.getString(R.string.tab_title_create); 
    } 
    return "WOOPS"; 

    } 

} 

MainActivty :

public class LaunchActivity extends FragmentActivity implements ActionBar.TabListener { 

    private PagerAdapter mAdapter; 
    private FragmentManager man; 
    private ViewPager mViewPager; 
    private ActionBar actionBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout_container); 

    // Set up the action bar. 
    actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    // Layout stuff 
    mViewPager = (ViewPager) findViewById(R.id.masterViewPager); 

    // Creating the mAdapter and initializing the mViewPager 
    man = getSupportFragmentManager(); 
    mAdapter = new PagerAdapter(man, getApplicationContext()); 
    mViewPager.setAdapter(mAdapter); 

    for (int i = 0; i < 2; i++) { 
     makeFragments(i); 
     System.out.println("Baking tasty fragment instances...nom nom nom"); 
    } 

    // Called when tab changes 
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 
     } 
    }); 

    for (int i = 0; i < mAdapter.getCount(); i++) { 
     System.out.println("Working..."); 

     actionBar.addTab(actionBar.newTab().setText(mAdapter.getPageTitle(i)).setTabListener(this)); 
    } 

    } 

    // Add fragment instances to ArrayList depending on their future position on the ActionBar 
    private void makeFragments(int i) { 

    if (i == 0) { 
     mAdapter.addFragment(ChatFragment.getInstance()); 

    } 
    else if (i == 1) { 
     mAdapter.addFragment(ContactFragment.getInstance()); 
    } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.layout_container, menu); 
    return true; 

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    mViewPager.setCurrentItem(tab.getPosition()); 

    } 

    public void addTab(int i) { 
    mAdapter.addFragment(ComposeFragment.getInstance()); 
    System.out.println("Created new Fragment, now adding it as a tab"); 
    actionBar.addTab(actionBar.newTab().setText(mAdapter.getPageTitle(i)).setTabListener(this)); 
    System.out.println("Added it as a tab. Hurray"); 

    } 

    /** IGNORE BELOW **/ 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 



} 

Stacktrace:

03-18 18:32:29.274: E/AndroidRuntime(26435): FATAL EXCEPTION: main 
    03-18 18:32:29.274: E/AndroidRuntime(26435): java.lang.IllegalStateException: Can't change tag of fragment ChatFragment{41492428 #1 id=0x7f070004 android:switcher:2131165188:1}: was android:switcher:2131165188:1 now android:switcher:2131165188:2 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:398) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:389) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:99) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:801) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.populate(ViewPager.java:992) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:523) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:495) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:875) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2690) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at com.package.subpackage.components.PagerAdapter.addFragment(PagerAdapter.java:25) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at com.package.subpackage.someapp.core.LaunchActivity.addTab(LaunchActivity.java:116) 
    03-18 18:32:29.274: E/AndroidRuntime(26435): at com. 

com.package.subpackage.fragments.full.ChatFragment$1.onClick(ChatFragment.java:51) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.view.View.performClick(View.java:4204) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.view.View$PerformClick.run(View.java:17355) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.os.Handler.handleCallback(Handler.java:725) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.os.Looper.loop(Looper.java:137) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at android.app.ActivityThread.main(ActivityThread.java:5041) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at java.lang.reflect.Method.invoke(Method.java:511) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-18 18:32:29.274: E/AndroidRuntime(26435): at dalvik.system.NativeStart.main(Native Method) 
+0

posten Sie Ihre gesamte Code und wenn möglich Beitrag der gesamte Stack-Trace – Triode

+0

Fertig. Die MainActivity (die die gesamte Registerkartenverwaltung enthält) und der PagerAdapter – AreusAstarte

+0

in der Funktion addFragment wurden hinzugefügt, um diese Codezeile in mFragments.add (fragment) zu ändern; zu mFragments.add (0, Fragment); Dies. – Triode

Antwort

0

Ich könnte dies erreichen, indem OnPageSelected Methode von OnPageChangeListener überschreiben. Stellen Sie sich vor, Sie haben drei Seiten in dieser Reihenfolge. A < -> B < -> C. Ziel ist es, C zu erreichen, wenn wir von A nach rechts scrollen und ähnlich A erreichen, wenn wir von C nach links scrollen.

Um dies zu tun, definieren Sie Ihre 5 Seiten haben (3 + 2) und die Seiten wie folgt organisieren:

C < -> A < -> B < -> C < -> A

Jetzt in der OnPageSelected-Methode, überprüfen und wenn Position 0, ändern Sie es in 3 (getCount() - 2) und wenn Position 4 (getCount() - 1), ändern Sie es auf 1. Stellen Sie sicher, dass dies wie kann helfe dir

Dank