简体   繁体   English

如何更改选中的标签图标?

[英]how to change selected tab icon?

in my app i want to change to selected tab's icon. 在我的应用程序中,我想更改为选定选项卡的图标。

I have a icons that selected and their unselected. 我有一个已选择的图标和未选择的图标。 When i select a tab it replace with selected icon. 当我选择一个选项卡时,它将替换为所选图标。

And also change tabcolor as you seen in pic. 并且还更改了tabcolor,如您在图片中看到的。 same color as selected tab's icons. 与所选标签的图标颜色相同。

![unselected for tab icon center][] ![未选中标签图标中心] []

![selected for tab icon center][] ![选择标签图标中心] []

my question is how can i do this ? 我的问题是我该怎么做? any advice or sample code please ? 有任何建议或示例代码吗?

here is my tablayout code 这是我的布局代码

public class HomeActivity extends BaseActivity {

    /**
     * Activity class name holder variable
     */
    private static final String CLASS_NAME = HomeActivity.class.getSimpleName();
    /**
     * Variables
     */
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;

    @Override
    protected int getLayoutResourceId() {
        return R.layout.activity_home;
    }

    @Override
    protected Activity getActivity() {
        return this;
    }

    @Override
    protected void initView() {

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

        setupTabIcons();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
    }


    @Override
    protected void onPause() {
        super.onPause();
        JZVideoPlayer.releaseAllVideos();
    }


    @Override
    public void onBackPressed() {

        if(JZVideoPlayer.backPress()){
            return;
        }
        super.onBackPressed();
    }

    private void setupTabIcons() {
        int[] tabIcons = {
                R.drawable.menu_join,
                R.drawable.menu_rate,
                R.drawable.menu_winners
        };

        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new JoinFragment(),  "join");
        adapter.addFrag(new RateFragment(),  "rate");
        adapter.addFrag(new WinnerFragment(),"winner");
        viewPager.setAdapter(adapter);
    }



    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment,String title){
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // return null to display only the icon
            return null;
        }
    }

}

Keep two icons in the drawable/mipmap . 在drawable / mipmap中保留两个图标。

  • one for tab selected icon 一个用于标签选择图标
  • and the other for tab unselected icon... (R.drawable.green for selection) , (R.drawable.blackfor unselection) 另一个用于选项卡未选择的图标... (R.drawable.green用于选择)(R.drawable.black用于取消选择)

If you have 3 icons , you need total 6 如果您有3个图标,则总共需要6个

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() 
      {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

            switch (tab.getPosition())
            {

                case 0:
                    tab.setIcon(R.drawable.green);
                    tabLayout.getTabAt(1).setIcon(R.drawable.black);
                    tabLayout.getTabAt(2).setIcon(R.drawable.black);

                    break;
                 case 1:
                    tab.setIcon(R.drawable.green);
                     tabLayout.getTabAt(2).setIcon(R.drawable.black);
                     tabLayout.getTabAt(0).setIcon(R.drawable.black);

                    break;
                 case 2:
                    tab.setIcon(R.drawable.green);
                     tabLayout.getTabAt(0).setIcon(R.drawable.black);
                     tabLayout.getTabAt(1).setIcon(R.drawable.black);
                    break;





            }



        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

Perform the following steps respectively.%100 Exact solution 分别执行以下步骤。%100精确的解决方案

app/src/main/res/values/colors.xml (Add to colors.xml) app / src / main / res / values / colors.xml(添加到colors.xml)

<color name="icon_enabled">#F3D65F</color>
<color name="icon_disabled">#FFFFFF</color>

app/src/main/res/color/custom_tab_icon.xml (Create a folder named color in res. Create a custom tab icon.xml in the folder.) app / src / main / res / color / custom_tab_icon.xml(在res中创建一个名为color的文件夹。在该文件夹中创建一个自定义选项卡icon.xml。)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:color="@color/icon_enabled" android:state_selected="true"/>
 <item android:color="@color/icon_disabled" android:state_selected="false"/>
</selector>

app/src/main/res/drawable/ic_action_settings.png (Create) app / src / main / res / drawable / ic_action_settings.png(创建)

double click on action_settings to add 双击action_settings添加

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="21.6"
android:viewportHeight="21.6"
android:tint="@color/custom_tab_icon">
<group android:translateX="-1.2"
  android:translateY="-1.2">
  <path
      android:fillColor="#FF000000"
 android:pathData="M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z"/>
</group>
</vector>

First create a ColorStateList programmatically or on your resource selector_color_tab.xml 首先以编程方式或在您的资源上创建一个ColorStateList。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorTabSelected" android:state_selected="true" />
    <item android:color="@color/colorTabUnselected" android:state_selected="false" />
</selector>

Create a method to tint a drawable from resource or drawable use this method 创建一种方法来着色资源中的可绘制对象或可绘制对象使用此方法

private Drawable tintDrawable(Context context, @DrawableRes int resId, ColorStateList stateList) {
    Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, resId)).mutate();
    DrawableCompat.setTintList(drawable, stateList);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    return drawable;
}

Then import your ColorStateList using this code 然后使用此代码导入您的ColorStateList

ColorStateList stateList = ContextCompat.getColorStateList(context, resId); ColorStateList stateList = ContextCompat.getColorStateList(context,resId);

Then finally with a for loop change the icons of the tabs 然后最后通过for循环更改选项卡的图标

    for (int i = 0; i < tabLayout.getTabCount(); i++) {
        TabLayout.Tab tabAt = tabLayout.getTabAt(i);
        if (tabAt != null) {
            tabAt.setIcon(tintDrawable(this, tabIcons[i], stateList));
        }
    }

Optional: 可选的:

If you want to add a tab selection listener simply register 如果要添加选项卡选择侦听器,只需注册

tabLayout.addOnTabSelectedListener(..listener) tabLayout.addOnTabSelectedListener(..听者)

or use 或使用

viewPager.addOnPageChangeListener(..listener) viewPager.addOnPageChangeListener(..听者)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM