6

Bu, sekmeler hakkında son sorum olacak, söz veriyorum :) (belki) Yani önceki sorulardan ve denedim ve hata Ben birkaç sekme oluşturan PagerAdapter adlı FragmentPagerAdapter var ve aynı zamanda bana dinamik olarak yeni sekmeler oluşturma yeteneği. sorun yeni sekmeler hep mevcut sekmelerin sağındaki takılı alacak olmasıdır:FragmentPagerAdapter ile soldaki sekmeleri ekle

(Resim:

  1. "statik girdi ekleyin:

    http://s7.directupload.net/file/d/3198/73dyzvzv_png.htm Aşağıdaki çalıştı null ", bu sekmelerden oluşan bir dizi kümesini oluştururken atlanacaktır. Sonra" Temp Sekmesi "oluştururken, istediğim parçayı bu girdiye geçersiz kılabilirdim. Bana biraz garip geldiler.Gerçekten bir garip İllegalSTateException ...

  2. şey iyi çalışacak düşündüm ve aslında gerçekten kötü çalışmak istediğini: Yerine ile parçaları ekleyerek:

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

mFragments.add(0, fragment); 

kullanmak Ama mesajla bir IllegalStateException verir : Temp parçasını eklemeye çalıştığımda. Şimdi, iki soru: Bir an uzakta tüm fragman etiketlerini almak ve hepsini ya da bir şey yeniden can

  1. o parça sekmesi etrafında bir yolu var mı? Veya

  2. Bunu yapmanın daha iyi ve zarif bir yolu var mı? Veya UI'imi sadece yeniden tasarlamalı mıyım? Böylece sekme sağa kullanılabilir mi? : P

DÜZENLEME: İşte bazı kodu: (bunları korkutmak olabilir çünkü istiyorum, sadece insanlara ölüm Duvar yayınlamak asla: 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

tüm kod sonrası ve olası yazı eğer tüm yığın izleme – Triode

+0

Yapıldı. AddFragment işlevindeki MainActivity (tüm sekme yönetimini tutan) ve PagerAdapter – AreusAstarte

+0

eklendiğinde, bu kod satırını mFragments.add (fragment) olarak değiştirin; mFragments.add (0, parça); bu. – Triode

cevap

0

OnPageSelected OnPageChangeListener yöntemini geçersiz kılarak bunu başarabilirim. Bu sırayla üç sayfanız olduğunu düşünelim. A < -> B < -> C. Eğer C'den sağa doğru gidersek ve C'den sola doğru kaydırırsak A'ya ulaşmak için hedef C'ye ulaşmaktır.

Bunu yapmak için tanımlamak senin 5 sayfaları (3 + 2), ve aşağıdaki gibi sayfaları düzenlemek için:

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

Şimdi onPageSelected yönteminde, eğer 0 konumundaysa ve varsa konumu 3 olarak değiştirin (getCount() - 2) ve eğer konum 4'teyse (getCount() - 1), bunu 1 olarak değiştirin. yardım et

Teşekkür