Android 使用FragmentPagerAdapter在左侧添加选项卡

Android 使用FragmentPagerAdapter在左侧添加选项卡,android,android-tabs,illegalstateexception,fragmentpageradapter,Android,Android Tabs,Illegalstateexception,Fragmentpageradapter,这将是关于标签的最后一个问题,我保证:)(也许吧) 因此,从前面的问题和尝试和错误中,我有一个称为PagerAdapter的片段PagerAdapter,它创建了几个选项卡,也使我能够动态创建新选项卡。 问题是,新选项卡将始终插入到现有选项卡的右侧: (图片: 我尝试了以下方法: 添加一个静态条目“null”,该条目在创建初始选项卡集时会被跳过。然后,在创建“Temp Tab”时,我可以将该条目覆盖到我想要的任何片段。给了我一些奇怪的非法状态异常 我认为这是最好的,但实际上我真的很想这样做:而不

这将是关于标签的最后一个问题,我保证:)(也许吧) 因此,从前面的问题和尝试和错误中,我有一个称为PagerAdapter的片段PagerAdapter,它创建了几个选项卡,也使我能够动态创建新选项卡。 问题是,新选项卡将始终插入到现有选项卡的右侧:

(图片:

我尝试了以下方法:

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

  • 我认为这是最好的,但实际上我真的很想这样做:而不是添加片段:

    private final List<Fragment> mFragments = new ArrayList<Fragment>();
    
    public void addFragment(Fragment fragment) {
        mFragments.add(fragment);
        notifyDataSetChanged();
    }
    
    但它给出了一个非法状态的例外信息:

    Can't change tag of fragment ChatFragment
    
    当我尝试添加临时片段时。 现在,有两个问题:

  • 有没有办法绕过碎片标签,我可以暂时拿走所有的碎片标签,然后重新构建它们或者其他什么

  • 有没有更好、更优雅的方法来实现这一点?或者我应该重新设计我的UI,以便选项卡可以正确使用吗

  • 编辑:这里有一些代码:(我永远不想只是贴一个死亡墙给人们,因为它可能会吓跑他们:o)

    碎片页雷达:

    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";
    
      }
    
    }
    

    我可以通过重写OnPaGeChanelEistInter的OnPopeSead方法来实现这一点。考虑到这个顺序ABC有三个页面。如果目标是从A向右转的话,如果C从/cP>向左滚动,那么目标是达到C。 要执行此操作,请将您的页面定义为5页(3+2),并按如下方式组织页面:

    卡布卡

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


    谢谢

    发布您的全部代码,如果可能的话,发布整个堆栈跟踪。在addFragment函数中添加MainActivity(包含所有选项卡管理)和PageRadaPter,将此行代码更改为MFFragments.add(fragment);to MFFragments.add(0,fragment);这个。好吧,如果你仔细阅读我的帖子,那正是我正在做的。这就是我得到IllegalStateException并抛出StackTrace的地方……我刚才显示它的方式是有效的,但是选项卡显示在其他选项卡的右侧,而不是左侧,而不是我想要的notifyDataSetChanged();只需使用notifyDataSetionValidated()
    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";
    
      }
    
    }
    
    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)