Skip to content

Instantly share code, notes, and snippets.

@mikovali
Created August 11, 2015 09:43
Show Gist options
  • Save mikovali/7a89b505cd6306bb94a8 to your computer and use it in GitHub Desktop.
Save mikovali/7a89b505cd6306bb94a8 to your computer and use it in GitHub Desktop.
Tinted icons for TabLayout in Android design support library with ViewPager
package io.github.mikovali.android;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
public class TabLayoutHelper {
public interface IconPagerAdapter {
@DrawableRes
int getPageTitleIconRes(int position);
@Nullable
Drawable getPageTitleIconDrawable(int position);
}
public static void setupWithViewPager(TabLayout tabLayout, ViewPager viewPager) {
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
setTabsFromPagerAdapter(tabLayout, viewPager.getAdapter());
tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
}
public static void setTabsFromPagerAdapter(TabLayout tabLayout, PagerAdapter pagerAdapter) {
if (!(pagerAdapter instanceof IconPagerAdapter)) {
tabLayout.setTabsFromPagerAdapter(pagerAdapter);
return;
}
final ColorStateList tabColors = tabLayout.getTabTextColors();
for (int i = 0; i < pagerAdapter.getCount(); i++) {
Drawable icon = ((IconPagerAdapter) pagerAdapter).getPageTitleIconDrawable(i);
if (icon == null) {
final int iconRes = ((IconPagerAdapter) pagerAdapter).getPageTitleIconRes(i);
icon = ResourcesCompat.getDrawable(tabLayout.getResources(), iconRes, null);
}
icon = DrawableCompat.wrap(icon);
DrawableCompat.setTintList(icon, tabColors);
tabLayout.addTab(tabLayout.newTab()
.setIcon(icon)
.setContentDescription(pagerAdapter.getPageTitle(i)));
}
}
}
@mikovali
Copy link
Author

Usage:

Implement TabLayoutHelper.IconPagerAdapter in your adapter

public class MyAdapter extends FragmentPagerAdapter implements TabLayoutHelper.IconPagerAdapter {

    // [...]

    @Override
    public int getPageTitleIconRes(int position) {
        // return drawable resource, ICONS here is SparseArray<Integer> mapping position to drawable
        return ICONS.get(position);
    }

    @Override
    public Drawable getPageTitleIconDrawable(int position) {
        // overrides getPageTitleIconRes, allows creating drawables on-the-fly
        final Drawable drawable = ...;
        return drawable;
    }
}

In Activity#onCreate or Fragment#onCreateView / Fragment#onViewCreated

// [...]

final TabLayout tabs = (TabLayout) findViewById(R.id.tabLayout);
final ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(new ExampleAdapter(getSupportFragmentManager()));

// customize drawable tint colors the same way as text or use XML attributes
tabs.setTabTextColors(Color.RED, Color.GREEN);
// call this instead of TabLayout#setupWithViewPager
TabLayoutHelper.setupWithViewPager(tabs, viewPager);

@codebreaker
Copy link

Found your gist really useful.
setTabsFromPagerAdapter()
seems to be deprecated. I have forked and updated the method with equivalent
setupWithViewPager(viewPager)
You can find my gist here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment