6

Это будет последний вопрос, который у меня есть о вкладках, я обещаю :) (возможно) Итак, из предыдущих вопросов и попыток и ошибок у меня есть FragmentPagerAdapter под названием PagerAdapter, который создает несколько вкладок, а также дает я могу динамически создавать новые вкладки. Проблема заключается в том, что новые вкладки будут всегда вставляются справа от моих существующих вкладок:Добавить вкладки влево с помощью FragmentPagerAdapter

(Изображение: http://s7.directupload.net/file/d/3198/73dyzvzv_png.htm

Я попытался следующие:

  1. Добавить статическую запись в " null ", который будет пропущен при создании встроенного набора вкладок, а затем при создании« вкладки Temp »я мог бы переопределить эту запись на любой фрагмент, который я хотел. Дал мне какой-то странный IllegalSTateException ...

  2. То, что я думал, что будет работать лучше, и на самом деле очень хотел работать плохо: Вместо добавления фрагментов с:

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

использовать

mFragments.add(0, fragment); 

Но это дает IllegalStateException с сообщением :

Can't change tag of fragment ChatFragment 

Когда я пытаюсь добавить временный фрагмент. Теперь два вопроса:

  1. Есть ли способ обойти эту вкладку фрагмент, я могу забрать все теги фрагмента на минуту и ​​восстановить их все или что-то? Или

  2. Есть ли лучший и элегантный способ сделать это? Или я должен просто изменить свой интерфейс, чтобы вкладка могла использоваться справа? : P

EDIT: Вот некоторые код: (Я никогда не хочу просто оставить стену смерти людей, потому что это может отпугнуть их: о)

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

размещать весь свой код и, если возможно, пост весь трассировки стека – Triode

+0

Готово. Добавлена ​​MainActivity (которая содержит все управление вкладками), а PagerAdapter – AreusAstarte

+0

в функции addFragment меняет эту строку кода на mFragments.add (фрагмент); к mFragments.add (0, фрагмент); это. – Triode

ответ

0

Я мог бы достичь этого, переопределив методPageSelected OnPageChangeListener. У вас есть три страницы в этом порядке A < -> B < -> C. Цель состоит в том, чтобы достичь C, если мы прокрутим прямо от A и аналогично достигнем A, если мы прокрутим влево от C.

Чтобы сделать это, определите ваши иметь 5 страниц (3 + 2), а также организовать страницы следующим образом:

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

Теперь в методе onPageSelected проверьте и если позиция if 0, измените его на 3 (getCount() - 2), и если позиция равна 4 (getCount() - 1), измените ее на 1. Убедитесь, что это похоже на can помогите u.

Благодаря

Смежные вопросы