使用FragmentPagerAdapter向左侧添加选项卡

[英]Add tabs to the left with FragmentPagerAdapter


This will be the last question I have about tabs, I promise :) (maybe) So from previous questions and try and error I have FragmentPagerAdapter called PagerAdapter which creates a few tabs and also gives me the ability to create new tabs dynamicly. The problem is that the new tabs will always get inserted to the RIGHT of my existing tabs:

这将是我对标签的最后一个问题,我保证:)(也许)所以从以前的问题和尝试和错误我有FragmentPagerAdapter调用PagerAdapter创建一些选项卡,并使我能够动态创建新选项卡。问题是新选项卡将始终插入到现有选项卡的右侧:

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

I tried the following:

我尝试了以下方法:

  1. Add a static entry of "null" that would be skipped when creating the intial set of tabs. Then later when creating "Temp Tab" I could override that entry to whatever fragment I desired. Gave me some strange IllegalSTateException...

    添加一个静态条目“null”,在创建初始选项卡集时将跳过该条目。然后在创建“Temp Tab”时,我可以将该条目覆盖到我想要的任何片段。给了我一些奇怪的IllegalSTateException ...

  2. The thing I thought would work the best and actually really wanted to work badly: Instead of adding fragments with:

    我认为这将是最好的,实际上真的很想工作:而不是添加片段:

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

to use

mFragments.add(0, fragment);

But it gives an IllegalStateException with the message:

但是它给出了一条带有消息的IllegalStateException:

Can't change tag of fragment ChatFragment

When I try to add the temp fragment. Now, two questions:

当我尝试添加临时片段时。现在,有两个问题:

  1. Is there a way around that fragment tab, can I take away all fragment tags for a moment and rebuild them all or something? Or

    有没有办法绕过该片段选项卡,我可以暂时取走所有片段标签并重建它们全部或其他东西吗?要么

  2. Is there a much better and elegant way to do this? Or should I just redesign my UI so that the tab can be used to the right? :P

    有没有更好,更优雅的方式来做到这一点?或者我应该重新设计我的用户界面,以便选项卡可以正确使用? :P

EDIT: Here some code: (I never wanna just post a Wall of death to people because it might scare them off :o )

编辑:这里有一些代码:(我从不想向人们发布死亡之墙,因为它可能吓跑他们: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)

1 个解决方案

#1


0  

I could achieve this by overriding onPageSelected method of OnPageChangeListener. Consider you have three pages in this order A<->B<->C. To goal is to reach C if we scroll right from A and similarly to reach A if we scroll left from C.

我可以通过覆盖OnPageChangeListener的onPageSelected方法来实现这一点。考虑你有三个页面顺序A < - > B < - > C。如果我们从A向右滚动,目标是达到C,如果我们从C向左滚动,则达到A。

To do this, define your to have 5 pages (3+2), and organize the pages as follows:

要执行此操作,请将您的页面定义为5页(3 + 2),并按如下方式组织页面:

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

Now in the onPageSelected method, check and if position if 0, change it to 3 (getCount()-2) and if position is 4 (getCount()-1), change it to 1. Make sure to this like can help u .

现在在onPageSelected方法中,检查并且如果位置为0,则将其更改为3(getCount() - 2),如果position为4(getCount() - 1),则将其更改为1.确保这样可以帮助您。

Thanks


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2013/03/18/af71b5a54b6cd38fcb28521440987813.html



 
  © 2014-2022 ITdaan.com 联系我们: