with viewpager tab studio fragments example activity android android-fragments android-viewpager androiddesignsupport

android - tab - ViewPager dentro de Fragment



tabs android studio example (1)

Estoy intentando agregar un viewpager a un fragmento usando la nueva biblioteca de diseño de soporte de Android. Tengo mi código xml para el diseño de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout>

Y la clase java correspondiente es la siguiente:

public class Tracks extends Fragment { ViewPager viewPager; TabLayout tabLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tracks, container, false); viewPager = (ViewPager) view.findViewById(R.id.viewpager); tabLayout = (TabLayout) view.findViewById(R.id.tabLayout); AppCompatActivity activity = (AppCompatActivity) getActivity(); assert activity.getSupportActionBar() != null; activity.getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.app_theme))); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupViewPager(viewPager); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager()); viewPagerAdapter.addFragment(new TopTracks(), "Top Tracks"); viewPagerAdapter.addFragment(new WorldCharts(), "World Charts"); viewPagerAdapter.addFragment(new NewMusic(), "New Music"); viewPagerAdapter.addFragment(new AfricaHot(), "Africa Hot"); viewPagerAdapter.addFragment(new Playlists(), "Playlists"); viewPagerAdapter.addFragment(new Recommended(), "Recommended"); viewPager.setAdapter(viewPagerAdapter); } private class ViewPagerAdapter extends FragmentPagerAdapter { List<Fragment> fragmentList = new ArrayList<>(); List<String> fragmentTitles = new ArrayList<>(); public ViewPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return fragmentTitles.get(position); } public void addFragment(Fragment fragment, String name) { fragmentList.add(fragment); fragmentTitles.add(name); } } }

El viewpager funciona correctamente, salvo por el hecho de que mis pestañas no se mostrarán. Todo lo que consigo es la siguiente pantalla:

He revisado el código muchas veces, pero todavía no puedo entender lo que está mal con mi código


Esa es una ViewCompat común con la biblioteca de soporte de diseño relacionada con ViewCompat .

@Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupViewPager(viewPager); // after you set the adapter you have to check if view is laid out, i did a custom method for it if (ViewCompat.isLaidOut(tabLayout)) { setViewPagerListener(); } else { tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { setViewPagerListener(); tabLayout.removeOnLayoutChangeListener(this); } }); } } private void setViewPagerListener() { tabLayout.setupWithViewPager(viewPager); // use class TabLayout.ViewPagerOnTabSelectedListener // note that it''s a class not an interface as OnTabSelectedListener, so you can''t implement it in your activity/fragment // methods are optional, so if you don''t use them, you can not override them (e.g. onTabUnselected) tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) { @Override public void onTabReselected(TabLayout.Tab tab) { super.onTabReselected(tab); } @Override public void onTabSelected(TabLayout.Tab tab) { super.onTabSelected(tab); } }); }