6

To będzie ostatnie pytanie jakie mam o zakładkach, obiecuję :) (może) Tak więc od poprzednich pytań i wypróbowania i błędu mam FragmentPagerAdapter o nazwie PagerAdapter, który tworzy kilka zakładek, a także daje ja możliwość dynamicznego tworzenia nowych kart. Problemem jest to, że nowe karty zawsze będą wstawiane na prawo od moich dotychczasowych zakładek:Dodaj zakładki po lewej z FragmentPagerAdapter

(zdjęcia: http://s7.directupload.net/file/d/3198/73dyzvzv_png.htm

Próbowałem następujące:

  1. Dodaj statycznego wpisu " null ", który byłby pomijany podczas tworzenia początkowego zestawu zakładek, a później, tworząc" Tabę Temp ", mógłbym zastąpić ten wpis dowolnie wybranym fragmentem Dał mi jakiś dziwny IllegalSTateException ...

  2. Rzecz myślałem, że działają najlepiej i rzeczywiście bardzo chciał pracować źle: Zamiast dodawania fragmenty z:

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

używać

mFragments.add(0, fragment); 

Ale daje IllegalStateException z komunikatem :

Can't change tag of fragment ChatFragment 

Kiedy próbuję dodać fragment tymczasowy. Teraz dwa pytania:

  1. Czy istnieje sposób wokół tej karcie fragmentu, może zabiorę wszystkie znaczniki fragmentów na chwilę i odbudować je wszystkie, czy co? Lub

  2. Czy jest o wiele lepszy i elegancki sposób na zrobienie tego? Czy powinienem po prostu przeprojektować mój interfejs, aby karta mogła być używana po prawej? : P

EDIT: Oto niektóre kodu: (I nigdy nie chcę po prostu pisać ściana śmierci ludzi, ponieważ może to odstraszyć je: 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

pisać cały kod, a jeśli to możliwe postu cały ślad stosu – Triode

+0

Gotowe. Dodano MainActivity (która przechowuje całe zarządzanie zakładkami) i PagerAdapter – AreusAstarte

+0

w funkcji addFragment zmienia ten wiersz kodu na mFragments.add (fragment); do mFragments.add (0, fragment); to. – Triode

Odpowiedz

0

Mogę to osiągnąć przez przesłonięcie metody OnPageSelected of OnPageChangeListener. Rozważ, że masz trzy strony w tej kolejności A < -> B < -> C. Celem jest osiągnięcie C, jeśli przewiniemy prawo z punktu A i podobnie, aby osiągnąć A, jeśli przewiniemy w lewo od C.

Aby to zrobić, definiować mieć 5 stron (3 + 2) i organizować strony następująco:

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

Teraz w metodzie onPageSelected sprawdź i jeśli pozycja jest 0, zmień ją na 3 (getCount() - 2), a jeśli pozycja wynosi 4 (getCount() - 1), zmień wartość na 1. Upewnij się, że to może pomóż u.

Dzięki