Modify the indicator length


title: 修改指示器长度
date: 2017-12-14 14:32:38

tags:AS

#修改指示器长度

  • 在有TabLayout的Fragment文件中,比如在:CloudFragment.java中进行如下更改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

public class CloudFragment extends BaseFragment{


@BindView(R.id.tlayout_header_navigation)
TabLayout tlayoutheadernavigation;

@BindView(R.id.viewpage_choice)
ViewPager viewpagechoice;




private CloudViewPageAdapter cloudViewPageAdapter;

@Override
protected int getLayoutId() {
return R.layout.fragment_cloud;
}

@Override
protected void initVariable() {

cloudViewPageAdapter = new CloudViewPageAdapter(getFragmentManager());
viewpagechoice.setAdapter(cloudViewPageAdapter);
tlayoutheadernavigation.setupWithViewPager(viewpagechoice);

}

@Override
protected void initView() {

// 修改tab指示器长度
setIndicator(tlayoutheadernavigation, Config.TAB_INDICATOR_LENGTH, Config.TAB_INDICATOR_LENGTH) ;

}

@Override
protected void loadData() {

}


/**
* 修改指示器长度的方法
*/
public void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}

tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}

int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());

for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
}

}
  • 其中在initView中 setIndicator启动
  • 这里面涉及静态变量,这个静态变量是用于设置指示器的长度,做一在Config.java中需要做定义
1
2
3
4
5
6
//CloudFragment.java中:
@Override
protected void initView() {

setIndicator(tlayoutheadernavigation, Config.TAB_INDICATOR_LENGTH, Config.TAB_INDICATOR_LENGTH) ;
}
1
2
3
4
5
6
//Config.java中:
/**
* tab指示器长度
*/
public static final int TAB_INDICATOR_LENGTH=50;
}
  • 同时在CloudFragment.java中public void 定义这个setIndicator方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 修改指示器长度的方法
*/
public void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}

tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}

int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());

for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
}

【注意】这里的Config里面的静态变量值,越大,显示出来的横条长度越短,是因为在Indicator函数中,我们所设置的静态数值,对应的是margin里的内容,所以当我们设置的数值越大,就说明我们边距margin越大,就导致所呈现出来的横条越短。

  • Congfig数值为65时

  • Congfig数值为25时