web-dev-qa-db-fra.com

Les onglets de TabLayout ne sont pas affichés

J'ai une activité principale, qui héberge un fragment, qui à son tour héberge un TabLayout (avec un ViewPager). La barre d'onglets est affichée, mais les onglets eux-mêmes ne sont pas affichés.

Voici mon code dans l'activité principale d'affichage du fragment d'hôte:

        Fragment fragment = new BMITabsFragment();

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(Constants.BMI_TABS_FRAGMENT).commit();

Voici mon fragment qui héberge TabLayout, qui est BMITabsFragment (s.a.):

public class BMITabsFragment extends Fragment {
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    // Get the ViewPager and set it's PagerAdapter so that it can display items
    ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    viewPager.setAdapter(new BMIFragmentPagerAdapter(getActivity().getSupportFragmentManager(),
            getActivity()));

    // Give the TabLayout the ViewPager
    TabLayout tabLayout = (TabLayout) view.findViewById(R.id.sliding_tabs);
    tabLayout.setupWithViewPager(viewPager);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_bmitabs, container, false);
    return view;
}
...
}

Voici mon FragmentPagerAdapter:

public class BMIFragmentPagerAdapter extends FragmentPagerAdapter {

final int PAGE_COUNT = 2;
private FragmentManager fragmentManager;
private Context context;

public BMIFragmentPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;
    this.fragmentManager = fm;

}

public BMIFragmentPagerAdapter(FragmentManager fm) {
    super(fm);
    fragmentManager = fm;

}

@Override
public CharSequence getPageTitle(int position) {
    String[] pageTitles = context.getResources().getStringArray(R.array.page_titles_array);
    return pageTitles[position];
}

@Override
public Fragment getItem(int position) {
    SharedPreferences prefs = context.getSharedPreferences(Constants.SHARED_PREFS_FILE, 0);
    long patientId = prefs.getLong(Constants.SELECTED_PATIENT_ID, 1);
    Fragment fragment = null;
    switch (position){
        case 0:
            return BMITabelleFragment.newInstance(patientId);

        case 1:
            return BMIChartFragment.newInstance(patientId);

        default:
            return BMITabelleFragment.newInstance(patientId);
    }
}

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

Et voici le fragment_bmitabs.xml:

<?xml version="1.0" encoding="utf-8"?>

<Android.support.design.widget.TabLayout
    Android:id="@+id/sliding_tabs"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:tabMode="scrollable" />

<Android.support.v4.view.ViewPager
    Android:id="@+id/viewpager"
    Android:layout_width="match_parent"
    Android:layout_height="0px"
    Android:layout_weight="1"
    Android:background="@Android:color/white" />

</LinearLayout>

Mon code est basé sur le Guide Android de Google à https://github.com/codepath/Android_guides/wiki/Google-Play-Style-Tabs-using-TabLayout

Qu'est-ce qui me manque ici?

Remarque: J'utilise AppCompatActivity et les bibliothèques de support v4 & v7 et le com: Android: support: bibliothèque de conception

11
mrd

J'ai le même problème! Mais ce correctif aussi moi.

tabLayout.post(new Runnable() {
    @Override
    public void run() {
        tabLayout.setupWithViewPager(viewPager);
    }
});

https://code.google.com/p/Android/issues/detail?id=180462

51

Définir les icônes d'onglet après setupWithViewPager()

private void setTabs {
   tabLayout.setupWithViewPager(viewPager);
   setupTabIcons();
} 

private void setupTabIcons() {
   tabLayout.getTabAt(0).setIcon(tabIcons[0]);
   tabLayout.getTabAt(1).setIcon(tabIcons[1]);
   tabLayout.getTabAt(2).setIcon(tabIcons[2]);
}
7
Vikram

comme @Nathaniel Ford a dit , cela devrait être un bogue, je change pour utiliser la bibliothèque de conception 23.0.1.google l'a corrigé, changez donc build.gradle en compile 'com.Android.support:design:23.0.1'. ps: vous devez également changer votre compileSdkVersion à 23 

6
chinaanihchen

Si vous utilisez l'attribut Android:tabPadding dans Tablayout du fichier xml, supprimez-le.

1

Aucune des autres réponses n'a fonctionné pour moi, j'ai essayé toutes les réponses 

Cependant, celui-ci ne: TabLayout n'affichant pas les onglets après l'ajout de la barre de navigation

Selon cette réponse, vous devez inclure votre TabLayout dans une AppBarLayout. Pourquoi? Qui sait. Mais au moins ça marche. 

Exemple de code (tiré de ce message):

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="200dp"
    Android:id="@+id/appBarLayout2">


    <Android.support.design.widget.TabLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/tabLayout2"
        app:tabMode="fixed"
        app:tabGravity="fill"

        ></Android.support.design.widget.TabLayout>

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

<Android.support.v4.view.ViewPager
    Android:layout_width="match_parent"
    Android:layout_height="300dp"
    Android:layout_alignParentStart="true"
    Android:layout_alignParentBottom="true"
    Android:id="@+id/viewPager2"
    Android:layout_below="@+id/appBarLayout2">

</Android.support.v4.view.ViewPager>
0
Roymunson