tablayout studio iconos ejemplo developers developer con activity android android-layout android-tablayout

studio - tabs con iconos android



El texto de las pestaƱas TabLayout no se muestra (3)

Estoy usando TabLayout dentro de un Fragment para mostrar tres pestañas fijas y las pestañas funcionan, pero no muestra el texto de la pestaña incluso después de configurar la app:tabTextColor atributo app:tabTextColor en el diseño aún no está visible.

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>


El problema es que está llamando a setupWithViewPager() después de configurar sus pestañas con las llamadas addTab() , sobrescribiéndolas efectivamente.

De la documentation de TabLayout respecto a setupWithViewPager() :

Las pestañas que se muestran en este diseño se rellenarán a partir de los ViewPager de página del adaptador ViewPager .

Si desea utilizar su TabLayout con un ViewPager , debe anular getPageTitle() en su PagerAdapter (y eliminar las llamadas addTab() , son redundantes).

Por ejemplo:

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; // shouldn''t happen } } @Override public int getCount() { return tabTitles.length; } // ... }


Gracias Hatem Badawi.

Empecé a desarrollar en Java recientemente. Utilicé WPF y XAML en .Net antes y las cosas son bastante diferentes allí cuando se trata de diseño de interfaz de usuario. De todos modos tuve el mismo problema. Quería definir TabItem en XML en lugar de hacerlo mediante programación. Como mencionó, esta llamada a setupWithViewPager () restablece el texto y el icono de los elementos de pestaña a nulo (utiliza el mismo objeto de pestaña, solo restablece su contenido). Usé tu enfoque pero lo hice más reutilizable. Aquí está mi código:

public class TabLayoutUtil { public static void setupTabLayoutWithViewPager(TabLayout tabLayout, ViewPager viewPager) { ArrayList<Pair<CharSequence, Drawable>> tabsContentCopy= new ArrayList<>(); for (int i = 0; i < tabLayout.getTabCount(); i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); tabsContentCopy.add(new Pair<>(tab != null ? tab.getText() : null, tab != null ? tab.getIcon() : null)); } tabLayout.setupWithViewPager(viewPager); for (int i = 0; i < tabLayout.getTabCount(); i++) { if (i<tabsContentCopy.size()) { tabLayout.getTabAt(i).setText(tabsContentCopy.get(i).first); tabLayout.getTabAt(i).setIcon(tabsContentCopy.get(i).second); } } } }


tabs.setupWithViewPager(viewPager) texto y el icono de la pestaña para cada pestaña después de llamar a 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));