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 adaptadorViewPager
.
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));