使用FragmentPagerAdapter向左侧添加选项卡

时间:2013-03-18 17:14:46

标签: android android-tabs illegalstateexception fragmentpageradapter

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

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

我尝试了以下内容:

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

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

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

    mFragments.add(0, fragment);
    

    但是它给出了IllegalStateException,并带有消息:

    Can't change tag of fragment ChatFragment
    

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

    1. 是否有解决该片段标签的方法,我可以暂时取走所有片段标签并重建它们全部或其他东西吗?或

    2. 有更好更优雅的方法吗?或者我应该重新设计我的UI,以便可以使用右侧的选项卡? :P

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

      堆栈跟踪:

          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 个答案:

答案 0 :(得分:0)

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

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

℃下; - &gt;一种与LT; - &GT; B&LT; - &GT;℃下; - &gt;一种

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

由于