以编程方式使用选项卡更改片段的选项卡索引

Posted

技术标签:

【中文标题】以编程方式使用选项卡更改片段的选项卡索引【英文标题】: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 【参考方案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_
        android:layout_>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            android:background="@color/al_white"
            android:elevation="0dp" />

       <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            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;
    

【讨论】:

这是我目前所做的,但由于没有附加包含其他选项卡布局的片段,但在尝试更改其选项卡位置时我得到一个空指针,我可以移动主要活动选项卡没有问题跨度>

以上是关于以编程方式使用选项卡更改片段的选项卡索引的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI 选项卡 - 如何获取当前选定的选项卡索引

如何在选项卡面板中获取活动选项卡索引?

如何重置 WinForms 应用程序上的选项卡索引?

如何根据 X、Y 坐标以编程方式确定表单上字段的选项卡索引?

如何在 jquery 中自动回发后维护选定的选项卡?

fltk 以编程方式更改选项卡组