【问题标题】:Change tab index of fragments with tabs programmatically以编程方式使用选项卡更改片段的选项卡索引
【发布时间】:2016-12-03 04:43:29
【问题描述】:

尝试以编程方式切换片段内选项卡布局的选项卡时出现空指针异常,

所以我的主要活动有一个选项卡布局(4 个选项卡)每个选项卡都有一个视图寻呼机保存一个片段,每个片段都有一个选项卡布局(x 数量的选项卡)和一个视图寻呼机保存一个片段, 我可以从这样的任何片段切换我的主要活动选项卡布局的选项卡

TabLayout tabLayout = MainActivity.tabLayout;
TabLayout.Tab tab = tabLayout.getTabAt(2);
tab.select();

但是如果我尝试以同样的方式更改其中一个片段的选项卡,我会得到一个空指针

TabLayout tabLayout2 = tabFragOne.tabLayout;
TabLayout.Tab tab2 = tabLayout2.getTabAt(2);
tab2.select();

只有当我在应用首次打开时单击相关按钮时才会发生这种情况,这表明其原因是尚未附加或创建片段,

例如,如果我滚动到要切换到的片段选项卡,然后返回主活动并按下相关按钮,它将起作用。 有人知道解决这个问题的最佳方法吗?

好吧,我发现这个问题的一半症结实际上是我使用了一个视图寻呼机适配器,一个问题 here 对我的问题有很多启发

【问题讨论】:

  • 你能发布堆栈跟踪吗?
  • 你有 FragmentPagerAdapter 吗?
  • 是的,抱歉,我没有在这里更新,今晚我将提供堆栈跟踪以及如何将片段附加到片段寻呼机适配器以及为什么我得到空指针,对不起,我我没有更新这个@Robin Dijkhof

标签: android android-fragments nullpointerexception tabs


【解决方案1】:

设置选中Tab的正确方法,我们应该从Pager设置选中索引。

final ViewPager pager = (ViewPager) findViewById(R.id.pager);
final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

tabLayout.setupWithViewPager(pager);
pager.setCurrentItem(0);//selected position

这是我在 xml 中的布局设计

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="#ffffff"
            android:background="@color/al_white"
            android:elevation="0dp" />

       <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            app:tabTextColor="#494a43"
            app:tabSelectedTextColor="#494a43"
            app:tabIndicatorColor="#494a43"
            app:tabIndicatorHeight="2dp"
            app:tabMode="fixed"
            app:tabGravity="fill" />
</android.support.design.widget.AppBarLayout>

【讨论】:

  • 当我使用它时,文本不会像它应该那样突出显示,或者像使用 getTabAt 那样突出
  • @MartinSeal,我不确定您的情况,但我认为您在 xml 中的 TabLayout 设计缺少一些配置。我在 xml 设计中添加了我的 TabLayout 示例。请检查。
【解决方案2】:
TabLayout tabhost = (TabLayout) getActivity().findViewById(R.id.tabLayout);
tabhost.getTabAt(2).select();

我在我的片段的创建函数中使用它......它完美地工作 R.id.tabLayout 是主活动布局中的标签布局 ID。

【讨论】:

    【解决方案3】:

    您可以在 viewpager 中使用 setCurrentItem(Postion) 示例:

    tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    // tabLayout.setupWithViewPager(mViewPager);
    mViewPager.setCurrentItem(4);
    

    【讨论】:

      【解决方案4】:

      自动从最后一页滚动到第一页的简单示例。注意:我在第一个和最后一个位置添加了一个虚拟片段。

              viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                  @Override
                  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
      
                  }
      
                  @Override
                  public void onPageSelected(int position) {
                      if (position == 0) {
                          viewPager.setCurrentItem(viewPagerAdapter.getCount() - 2);
                      } else if (position == viewPagerAdapter.getCount() - 1) {
                          viewPager.setCurrentItem(1);
                      }
                  }
      
                  @Override
                  public void onPageScrollStateChanged(int state) {
      
                  }
              });
      

      【讨论】:

      • 这看起来很酷,谢谢,我尝试实现它,但由于我需要调用它,我无法从静态上下文中获取 viewPagerAdapter.getCount()
      【解决方案5】:

      使用视图分页器,它的工作简单而精细

      public class ViewPagerAdapter  extends FragmentStatePagerAdapter {
      
      CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
      int NumbOfTabs;
      String mode;
      AllDeals deals;     
      MyDeals myDeals;    those are my fragments
      
      
      public ViewPagerAdapter(FragmentManager fm, int mNumbOfTabsumb, String moe) {
          super(fm);
          this.NumbOfTabs = mNumbOfTabsumb;
          mode=moe;
      }
      
      @Override
      public Fragment getItem(int position) {
      
          switch (position) {
              case 0:
                  if(mode.equals("Deals")){
                       deals=new AllDeals();
                      return deals;
                  } 
                  break;
      
              case 1:
      
                  if(mode.equals("Deals")){
                      myDeals=new MyDeals();
                      return myDeals;
                  } 
      
                 break;
              default:
                  break;
      
          }
          return null;
      }
      
      
      
      @Override
      public int getCount() {
          return NumbOfTabs;
      }
       }
      

      将此行添加到您的活动中

        containerViewone.setVisibility(View.VISIBLE);
         tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.title_all_deals)));
                          tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.title_my_deals)));
                          tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
                          tabLayout.setTabTextColors(getResources().getColor(R.color.tabunselect), getResources().getColor(R.color.black));
                          viewpagerad = new ViewPagerAdapter(getSupportFragmentManager(), Numboftabs, "Deals");
                           pager.setAdapter(viewpagerad);
                          pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
      

      【讨论】:

        【解决方案6】:

        试试这个:

         TabLayout tablayout;
              @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main); //your activity layout
                    tabLayout =(TabLayout)findViewById(R.id.tablayout); //your tab layout id
                    tabLayout.getTabAt(0).select(); //your tab index;
            }
        

        【讨论】:

        • 这是我目前所做的,但由于没有附加包含其他选项卡布局的片段,但在尝试更改其选项卡位置时我得到一个空指针,我可以移动主要活动选项卡没有问题跨度>
        猜你喜欢
        • 1970-01-01
        • 2015-06-01
        • 2011-06-12
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多