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

时间:2016-07-28 16:47:05

标签: android android-fragments nullpointerexception tabs

尝试以编程方式切换片段内的tablayout时,我得到一个空指针异常,

所以我的主要活动有一个标签布局(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为我的问题提供了很多启示

6 个答案:

答案 0 :(得分:2)

设置选定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>

答案 1 :(得分:1)

TabLayout tabhost = (TabLayout) getActivity().findViewById(R.id.tabLayout);
tabhost.getTabAt(2).select();

我在片段的创建功能中使用它...它完美无缺 R.id.tabLayout是主要活动布局中的tablayout ID。

答案 2 :(得分:0)

试试这个:

<div class="form-group">
<div class="medium-6 columns">    
<?php 
echo form_label('First Name'); 

$data = array(
  'class'=>'form-control',
  'name'=>'fname',
  'placeholder'=>'First Name'
);

echo form_input($data);
?>
</div>

答案 3 :(得分:0)

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

My Implemented code

答案 4 :(得分:0)

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

        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) {

            }
        });

答案 5 :(得分:0)

使用view pager,工作简单

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));