Tablayout自定义+viewpage2

一、需要实现的效果

四个类似按钮的tab,点击可切换viewPage,也可滑动viewpage,联动,点击按钮背景颜色和字体颜色都需要改变
在这里插入图片描述

二.先来看看TabLayout的各个属性:

⒈app:tabIndicatorColor:下划线的颜色。

⒉app:tabSelectedTextColor:选中菜单项后字体的颜色。

⒊app:tabTextColor:未选中是的字体颜色

⒋app:tabMode:取值有两个属性,TabLayout.MODE_FIXED与TabLayout.MODE_SCROLLABLE

TabLayout.MODE_FIXED:固定的选项卡,在选项卡较少的情况下使用(选项卡的总宽度和不会大于屏幕宽,不然就是被挤压)

            TabLayout.MODE_SCROLLABLE:在未确定选项卡数量的情况下使用,不会被挤压,同时屏幕外的选项卡需要滑动才能显示。

⒌app:tabGravity:两个值,fill与center。

center:在选项卡较少的情况下使用,居中。

fill :选项卡较多情况下使用,填充。

⒍app:tabContentStart:控件对于左边的距离,可看成marginLeft;

⒎app:tabBackground:选项卡的背景色,不设置的情况其颜色与标题栏一样。

⒏app:tabIndicatorHeight:下划线的高度

⒐app:tabMaxWidth:选项卡的最大宽度

⒑app:tabMinWidth:选项卡的最小宽度

⒒app:tabTextAppearance:使用该属性设置样式可以为标签的头部设置图片。当你在viewpager适配器中getPagerTitle中设置了图片,如果不设置TextAppearance.Design.Tab中textAllCaps设置为false。图片是不会显示的。

⒓app:tabPadding:于padding一样。
设置了这两行:

        app:tabPaddingEnd="0dp"
        app:tabPaddingStart="0dp"

效果如下:
在这里插入图片描述
如果没有设置,会是这样的:
在这里插入图片描述
13.app:tabRippleColor="@null"去掉点击时背景色
在这里插入图片描述

三、tab+viewpage实现

tab需要在build.gradle中加入,否则会报错误: 程序包com.google.android.material.tabs不存在
import com.google.android.material.tabs.TabLayout;
在这里插入图片描述

dependencies {
    
    
	...
	implementation 'com.google.android.material:material:1.2.0-alpha06'
}
          <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp"
                app:tabGravity="center"
                app:tabIndicatorGravity="center"
                app:tabMaxWidth="0dp"
                app:tabMode="fixed"
                app:tabRippleColor="@null" />

            <androidx.viewpager2.widget.ViewPager2
                android:id="@+id/view_pager2"
                android:layout_width="150dp"
                android:layout_height="50dp"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="14dp" />

完整代码如下:

		final String[] tabs = new String[]{
    
    "条", "烈", "薄", "波"};
        binding.viewPager2.setAdapter(new FragmentStateAdapter(this) {
    
    
            @Override
            public Fragment createFragment(int position) {
    
    
                PlayerRhythmFragment playerRhythmFragment = new PlayerRhythmFragment(position);
                playerRhythmFragment.setCurMusicState(musicState);
                tabFragmentsCreators.put(position, playerRhythmFragment);
                return playerRhythmFragment;
            }

            @Override
            public int getItemCount() {
    
    
                return tabs.length;
            }

        });
        binding.viewPager2.setUserInputEnabled(musicState == 1);//设置是否禁止用户滑动
        binding.viewPager2.setCurrentItem(musicStyle, false);
        binding.tabLayout.setSelectedTabIndicator(0);//去掉tab自带的背景线
        
        //自定义Tab
        mediator = new TabLayoutMediator(binding.tabLayout, binding.viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
    
    
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
    
    
                View view = LayoutInflater.from(getContext()).inflate(R.layout.widget_choose_icon_tag_bg, null);
                TextView tv = (TextView) view.findViewById(R.id.choose_icon_tab_tv);
                tv.setText(tabs[position]);

                int[][] states = new int[2][];
                states[0] = new int[]{
    
    android.R.attr.state_selected};
                states[1] = new int[]{
    
    };

                int[] colors = new int[]{
    
    activeColor, normalColor};
                ColorStateList colorStateList = new ColorStateList(states, colors);
                tv.setTextColor(colorStateList);
                tab.setCustomView(view);
                LinearLayout tabStrip = ((LinearLayout) binding.tabLayout.getChildAt(0));
                for (int i = 0; i < tabStrip.getChildCount(); i++) {
    
    
                    tabStrip.getChildAt(i).setOnTouchListener(new View.OnTouchListener() {
    
    
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
    
    
                            return isEnabledClick;
                        }
                    });
                }
            }
        });

四、重点代码单伶说一下

1、禁止tab的点击

LinearLayout tabStrip = ((LinearLayout) binding.tabLayout.getChildAt(0));
for (int i = 0; i < tabStrip.getChildCount(); i++) {
    
     
     tabStrip.getChildAt(i).setOnTouchListener(new View.OnTouchListener() {
    
    
       @Override
       public boolean onTouch(View v, MotionEvent event) {
    
    
            return isEnabledClick;
       }
});
}

2、去掉tab自带的背景线

binding.tabLayout.setSelectedTabIndicator(0);//去掉tab自带的背景线

3、禁止用户滑动

binding.viewPager2.setUserInputEnabled();

五、UI代码

1、自定义tab:

widget_choose_icon_tag_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/choose_icon_tab_tv"
        android:layout_width="56dp"
        android:layout_height="24dp"
        android:background="@drawable/selector_icon_choose_txt_bg"
        android:gravity="center"
        android:textSize="12sp" />
</LinearLayout>

2、点击按钮背景切换

selector_icon_choose_txt_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/shape_icon_choose_select" android:state_checked="true" />
    <item android:drawable="@drawable/shape_icon_choose_select" android:state_selected="true" />
    <item android:drawable="@drawable/shape_icon_choose_no_select" />
</selector>

shape_icon_choose_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp"/>
    <solid android:color=" #D4D8E1"/>
</shape>

shape_icon_choose_no_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp"/>
    <solid android:color="#1E232D"/>
</shape>

3、点击字体颜色变化

private int activeColor = Color.parseColor("#0F1117");
private int normalColor = Color.parseColor("#8F9399");
...
	mediator = new TabLayoutMediator(binding.tabLayout, binding.viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
    
    
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
    
    
    .....
    int[] colors = new int[]{
    
    activeColor, normalColor};
                ColorStateList colorStateList = new ColorStateList(states, colors);
                tv.setTextColor(colorStateList);
                .....
                }
 	}

猜你喜欢

转载自blog.csdn.net/qq_32670947/article/details/128297902