2016-07-28 2 views
6

Я получаю исключение нулевого указателя при попытке переключения вкладок программны из 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(); 

это происходит только тогда, когда я нажимаю кнопку в вопрос, когда первый открывает приложение, что позволяет предположить, что причиной этого является то, что фрагмент не присоединен или создана,

, например, если я просматриваю вкладку фрагментов, на которую я хочу переключиться, а затем вернитесь к основному действию и нажмите соответствующую кнопку, это будет работать. Кто-нибудь знает, как лучше всего это исправить?

Ok Ive нашел половину суть на этот вопрос на самом деле, что им с помощью пейджера адаптера вида, вопрос here проливает много света на моем вопросе

+0

Можете ли вы опубликовать stacktrace? – nshmura

+0

У вас есть FragmentPagerAdapter? –

+0

Да, мне жаль, что я не обновил здесь, сегодня вечером буду тратить трассировку стека и как я прикрепляю фрагменты к адаптеру пейджера фрагмента и почему я получаю нулевой указатель, извините, что я не обновлял этот @Robin Dijkhof –

ответ

2

Правильный путь, чтобы установить выбранную вкладку, мы должны заданный набор индекс от пейджера.

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> 
+0

, когда я использую это, текст не выделяется так, как должен, или нравится ему с использованием getTabAt –

+0

@MartinSeal, я не уверен в вашем случае, но я думаю, что ваш проект TabLayout в xml не имеет какой-либо конфигурации. Я добавил свой пример TabLayout в xml-дизайне. Пожалуйста, проверьте. –

0

Попробуйте это:

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; 
    } 
+0

это то, что я сейчас делаю, но поскольку фрагмент, содержащий другой макет вкладки, еще не прикреплен, я получаю нулевой указатель при попытке изменить его положение табуляции, я могу перемещать вкладку основной активности без проблем. –

0

вы можете использовать setCurrentItem (ПОлОжЕНИЕ) в ViewPager пример:

tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); 
// tabLayout.setupWithViewPager(mViewPager); 
mViewPager.setCurrentItem(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) { 

      } 
     }); 
+0

это выглядит круто, спасибо, ive попробовал для его реализации, но из-за того, где мне нужно его вызвать, я не могу получить viewPagerAdapter.getCount() из статического контекста –

0

Использование вида пейджера, Его разработка простой и тонкой

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)); 
1
TabLayout tabhost = (TabLayout) getActivity().findViewById(R.id.tabLayout); 
tabhost.getTabAt(2).select(); 

Я использую это в создании функции моего фрагмента ... и он отлично работает R.id.tabLayout - это идентификатор tablayout в вашем основном макете деятельности.

Смежные вопросы