TabLayout(仿iOS自定义segement+scrollerview)

tabIndicatorHeight 设置width(默认只能设置height)

通过反射来设置width,代码如下
实现如下:(为了支持单个item样式改变,所以设置了一个匿名函数回调)

    /***
     * 通过反射更改tablayout的线宽度
     * */
    public interface IndicatorWidthClick{
        // 回调设置 item
        void setUpChildren(int position,LinearLayout.LayoutParams params,View child);
    }
    public static void setUpIndicatorWidth(TabLayout tabLayout, IndicatorWidthClick click) {
        Class<?> tabLayoutClass = tabLayout.getClass();
        Field tabStrip = null;
        try {
            tabStrip = tabLayoutClass.getDeclaredField("mTabStrip");
            tabStrip.setAccessible(true);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        LinearLayout layout = null;
        try {
            if (tabStrip != null) {
                layout = (LinearLayout) tabStrip.get(tabLayout);
            }
            for (int i = 0; i < layout.getChildCount(); i++) {
                View child = layout.getChildAt(i);
                child.setPadding(0, 0, 0, 0);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
                click.setUpChildren(i,params,child);
                child.setLayoutParams(params);
                child.invalidate();
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

使用如下:(ReflectionHelper是我写的反射的帮助类,放置反射相关)

        final int leftPading = dp2px(this, 30);
        final int rightPading = dp2px(this, 40);
        ReflectionHelper.setUpIndicatorWidth(segeView, new ReflectionHelper.IndicatorWidthClick() {
            @Override
            public void setUpChildren(int position, LinearLayout.LayoutParams params, View child) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                    if (position == 0){
                        params.setMarginStart(leftPading);
                        params.setMarginEnd(rightPading);
                    }else {
                        params.setMarginStart(rightPading);
                        params.setMarginEnd(leftPading);
                    }
                }
            }
        });

TabLayout与viewpage绑定使用

        segeView.setupWithViewPager(hScrollerView);

TabLayout title的获取(viewpage的getPageTitle)

// 
@Override
    public CharSequence getPageTitle(int position) {
// 此方法返回
}

更改TabLayout的样式(标示线的颜色,标题的颜色大小,TabLayout的背景颜色)

<android.support.design.widget.TabLayout
    style="@style/AppTabLayout"
    app:tabTextAppearance="@style/AppTabTextAppearance"
    android:layout_width="match_parent"
    .... />
<style name="AppTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabMaxWidth">@dimen/tab_max_width</item>
        <item name="tabIndicatorColor">?attr/colorAccent</item>
        <item name="tabIndicatorHeight">4dp</item>
        <item name="tabPaddingStart">6dp</item>
        <item name="tabPaddingEnd">6dp</item>
        <item name="tabBackground">?attr/selectableItemBackground</item>
        <item name="tabTextAppearance">@style/AppTabTextAppearance</item>
        <item name="tabSelectedTextColor">@color/range</item>
    </style>

    <!-- for text -->
    <style name="AppTabTextAppearance" parent="TextAppearance.Design.Tab">
        <item name="android:textSize">12sp</item>
        <item name="android:textColor">@color/orange</item>
        <item name="textAllCaps">false</item>
    </style>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容