2016-06-27 2 views
33

Я использую TabLayout внутри Fragment для отображения трех фиксированных вкладок, и вкладки работают, но он не отображает текст вкладки даже после того, как я установил атрибутв макете, который все еще не отображается.TabLayout tabs текст не отображается

NewFragment.java

public class NewFragment extends Fragment { 

private RecyclerView mRecyclerView; 
private RecyclerView.LayoutManager mLayoutManager; 
private RecyclerView.Adapter mAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View inflatedView = inflater.inflate(R.layout.new_fragment, container, false); 

    TabLayout tabLayout = (TabLayout) inflatedView.findViewById(R.id.tabLayout); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
    final ViewPager viewPager = (ViewPager) inflatedView.findViewById(R.id.viewpager); 

    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 

    viewPager.setAdapter(new PagerAdapter(getFragmentManager(), tabLayout.getTabCount())); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setupWithViewPager(viewPager); 
    tabLayout.setTabMode(TabLayout.MODE_FIXED); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 

     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 

    return inflatedView; 
} 

public class PagerAdapter extends FragmentStatePagerAdapter { 
    int mNumOfTabs; 

    public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
     super(fm); 
     this.mNumOfTabs = NumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       return new FragmentTab(); 
      case 1: 
       return new FragmentTab(); 
      case 2: 
       return new FragmentTab(); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return mNumOfTabs; 
    } 
} 
} 

newfragment.xml

<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
tools:context=".NewFragment"> 

<android.support.design.widget.TabLayout 
    android:id="@+id/tabLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabMode="fixed" 
    app:tabTextColor="#ffffff" 
    app:tabGravity="fill" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white"/> 

</android.support.design.widget.AppBarLayout> 

ответ

66

Проблема в том, что вы звоните setupWithViewPager() после настройки вкладок с addTab() вызовов, эффективно их перезаписью.

С documentation из TabLayout относительно setupWithViewPager():

Вкладки отображаются в этом макет будет заполняться из заголовков страниц в ViewPager адаптера.

Если вы хотели бы использовать ваш TabLayout с ViewPager, вы должны переопределить getPageTitle() в вашем PagerAdapter (и удалить addTab() вызовы, они излишни).

Например:

public class ExamplePagerAdapter extends FragmentStatePagerAdapter { 

    // tab titles 
    private String[] tabTitles = new String[]{"Tab1", "Tab2", "Tab3"}; 

    public ExamplePagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    // overriding getPageTitle() 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabTitles[position]; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return new Tab1Fragment(); 
      case 1: 
       return new Tab2Fragment(); 
      case 2: 
       return new Tab3Fragment(); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return tabTitles.length; 
    } 

    // ... 
} 
+1

спасатель ... спасибо :) – Faytraneozter

+0

Спасибо за время принятия и размещения этого ответ. Это помогло :) – Mona

+1

Спасибо большое @ earthw0rmjim .... Ты спас мой день :) :) – MashukKhan

2

я добавил вкладку текст и значок для каждой вкладки после вызова tabs.setupWithViewPager(viewPager)

viewPager.setAdapter(new MyViewAdapter(getSupportFragmentManager())); 
    TabLayout tabs=(TabLayout) findViewById(R.id.tabs); 
    tabs.setupWithViewPager(viewPager); 
    tabs.getTabAt(0).setIcon(R.drawable.icon1); 
    tabs.getTabAt(1).setIcon(R.drawable.icon2); 
    tabs.getTabAt(0).setText(getResources().getText(R.string.tab1)); 
    tabs.getTabAt(1).setText(getResources().getText(R.string.tab2)); 
+0

Будет ли это работать Если вызывается 'tabs.setupWithViewPager (viewPager);' после установки вкладок – Avinash

+0

да, это сработает –

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