2016-07-28 51 views
6

試圖以編程方式切換片段內tablayout的標籤時,我得到一個空指針異常,更改標籤索引編程

所以我有了一個標籤佈局我的主要活動(4個選項卡)每個選項卡都有一個視圖頁面持有一個片段,並且每個片段都有一個選項卡布局(x選項卡),並帶有一個持有片段的視圖頁面, 我可以將我的主要活動選項卡布局的選項卡從任何片段這

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

但如果我試圖改變其中一個片段的選項卡以相同的方式ig等一個空指針

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

如果我點擊有關按鈕的應用程序第一次打開時,這表明它的原因是,該片段尚未連接或尚未建立時纔會發生,

例如,如果我滾動到我想要切換到的片段選項卡,然後返回到主要活動並按問題的按鈕它將工作。 沒有人知道解決這個問題的最佳方法嗎?

好香港專業教育學院發現一半的癥結這個問題實際上是一個即時通訊使用的視圖尋呼機適配器,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

當我使用這個文本doesnt突出像它應該,或者它喜歡它使用getTabAt –

+0

@MartinSeal,我不知道你的情況,但我認爲你的TabLayout設計在XML中缺少一些配置。我已經在xml設計中添加了我的TabLayout示例。請檢查。 –

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標識。