美文网首页Android开发
android TabLayout下标随文字长度变化长宽。

android TabLayout下标随文字长度变化长宽。

作者: 背锅TV丶伴奏大师 | 来源:发表于2019-01-15 15:59 被阅读20次

    代码如下:

    public static void setIndicator(final TabLayout tabs, final List<BaseFragment> fragments){
            tabs.post(new Runnable() {
                @Override
                public void run() {
                    int screenWidth = RxDeviceTool.getScreenWidth(tabs.getContext());
                    int textlength = 0;
                    int length = 0;
                    try {
                        //拿到tabLayout的mTabStrip属性
                        Field mTabStripField = tabs.getClass().getDeclaredField("mTabStrip");
                        mTabStripField.setAccessible(true);
                        LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabs);
                        int dp10 = DimenUtil.dip2px(10);
                        int dp2 = DimenUtil.dip2px(2);
                        for(int i = 0; i < mTabStrip.getChildCount(); i++){
                            View tabView = mTabStrip.getChildAt(i);
    
                            //拿到tabView的mTextView属性
                            Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                            mTextViewField.setAccessible(true);
    
                            TextView mTextView = (TextView) mTextViewField.get(tabView);
    
                            tabView.setPadding(0, 0, 0, 0);
    
                            //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度
                            int width = 0;
                            width = mTextView.getWidth();
                            if (width == 0) {
                                mTextView.measure(0, 0);
                                width = mTextView.getMeasuredWidth();
                            }
                            textlength = width+textlength;
                        }
    
                        //当不满一屏幕的时候间距平均分配
                        length = fragments.size()*dp10+dp10+textlength;
                        if(screenWidth>length){
                            dp10 = (screenWidth-textlength)/(fragments.size()+1);
                        }
                        for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                            View tabView = mTabStrip.getChildAt(i);
    
                            //拿到tabView的mTextView属性
                            Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                            mTextViewField.setAccessible(true);
    
                            TextView mTextView = (TextView) mTextViewField.get(tabView);
    
                            tabView.setPadding(0, 0, 0, 0);
    
                            //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度
                            int width = 0;
                            width = mTextView.getWidth();
                            if (width == 0) {
                                mTextView.measure(0, 0);
                                width = mTextView.getMeasuredWidth();
                            }
    
                            //设置tab左右间距为10dp  注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
                            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                            params.width = width ;
                            params.leftMargin = dp10;
                            params.rightMargin = dp10;
                            params.bottomMargin = dp2;
                            tabView.setLayoutParams(params);
                            tabView.invalidate();
                        }
    
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    

    另外一个方法:

    //改变tablayout的下划线宽度
        public static void setTabWidth(final TabLayout tabLayout,final int padding){
            tabLayout.post(new Runnable() {
                @Override
                public void run() {
                    try {
                        //拿到tabLayout的mTabStrip属性
                        LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0);
                        for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                            View tabView = mTabStrip.getChildAt(i);
                            //拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextView
                            Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                            mTextViewField.setAccessible(true);
                            TextView mTextView = (TextView) mTextViewField.get(tabView);
                            tabView.setPadding(0, 0, 0, 0);
                            //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度
                            int width = 0;
                            width = mTextView.getWidth();
                            if (width == 0) {
                                mTextView.measure(0, 0);
                                width = mTextView.getMeasuredWidth();
                            }
                            //设置tab左右间距 注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
                            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                            params.width = width ;
                            params.leftMargin = padding;
                            params.rightMargin = padding;
                            tabView.setLayoutParams(params);
                            tabView.invalidate();
                        }
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    

    有bug,记录一下。有好的方法欢迎大家建议。

    相关文章

      网友评论

        本文标题:android TabLayout下标随文字长度变化长宽。

        本文链接:https://www.haomeiwen.com/subject/pyyydqtx.html