android activity 叠加 软键盘,Android 原生NumberPicker控件修改分割线颜色及字体颜色大小(附:省市区联动)...

c0d32f1b1be2be81407e3410cea5a199.png

因Android自带的NumberPicker不支持直接设置分割线的颜色和字体颜色,所以:

1、NumberPicker字体颜色:

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

publicclassQNumberPickerextendsNumberPicker {

publicQNumberPicker(Context context) {

super(context);

}

publicQNumberPicker(Context context, AttributeSet attrs) {

super(context, attrs);

}

publicQNumberPicker(Context context, AttributeSet attrs,intdefStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

publicvoidaddView(View child) {

super.addView(child);

updateView(child);

}

@Override

publicvoidaddView(View child,intindex,

android.view.ViewGroup.LayoutParams params) {

super.addView(child, index, params);

updateView(child);

}

@Override

publicvoidaddView(View child, android.view.ViewGroup.LayoutParams params) {

super.addView(child, params);

updateView(child);

}

publicvoidupdateView(View view) {

if(viewinstanceofEditText) {

//这里修改字体的属性

((EditText) view).setTextColor(Color.parseColor("#BAA785"));

//            ((EditText) view).setTextSize();

}

}

}

继承和重写NumberPicker,在xml中使用修改过的NumberPicker

1

2

3

android:layout_width="90dp"

android:layout_height="wrap_content"/>

2、NumberPicker分割线颜色

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

privatevoidsetNumberPickerDividerColor(NumberPicker numberPicker) {

NumberPicker picker = numberPicker;

Field[] pickerFields = NumberPicker.class.getDeclaredFields();

for(Field pf : pickerFields) {

if(pf.getName().equals("mSelectionDivider")) {

pf.setAccessible(true);

try{

//设置分割线的颜色值

pf.set(picker,newColorDrawable(this.getResources().getColor(R.color.green)));

}catch(IllegalArgumentException e) {

e.printStackTrace();

}catch(Resources.NotFoundException e) {

e.printStackTrace();

}catch(IllegalAccessException e) {

e.printStackTrace();

}

break;

}

}

}

这个方法是通过反射拿到mSelectionDivider属性,然后给他设置上颜色值。(此方法在NumberPicker 的 setDisplayedValues后调用)

补充: DatePicker的分割线颜色

DatePicker和NumberPicker设置分割线颜色差不多,只是需要先拿到外面的LinearLayout

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

privatevoidsetDatePickerDividerColor(DatePicker datePicker){

// Divider changing:

// 获取 mSpinners

LinearLayout llFirst = (LinearLayout) datePicker.getChildAt(0);

// 获取 NumberPicker

LinearLayout mSpinners = (LinearLayout) llFirst.getChildAt(0);

for(inti =0; i < mSpinners.getChildCount(); i++) {

NumberPicker picker = (NumberPicker) mSpinners.getChildAt(i);

Field[] pickerFields = NumberPicker.class.getDeclaredFields();

for(Field pf : pickerFields) {

if(pf.getName().equals("mSelectionDivider")) {

pf.setAccessible(true);

try{

pf.set(picker,newColorDrawable(this.getResources().getColor(R.color.green)));

}catch(IllegalArgumentException e) {

e.printStackTrace();

}catch(NotFoundException e) {

e.printStackTrace();

}catch(IllegalAccessException e) {

e.printStackTrace();

}

break;

}

}

}

}

附:NumberPicker 省市区联动

那这些修改有什么用呢?可以只用NumberPicker做一个流畅的省市区联动,而不用去关联library了。修改NumberPicker分割线颜色为透明(我这用的是黑色,但透明的分割线体验更好),将三个NumberPicker并排平分宽度放在一个PopupWindow中或者随便放在哪,第一个为省,第二个为市,第三个为区

用以下代码关掉编辑模式,不然Picker上会有光标和软键盘弹出来

1

mProvince.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

网上很多都是存在本地的xml或者json文件来存,因项目中实际为三个请求来获取服务器上的省市区,不能用本地数据,所以视图加载的时候首先获取省,setDisplayedValues显示出来,再通过给省和市设置的OnValueChangedListener,拿到里面的newVal,根据这个在省数组中的位置来动态请求相应数据来设置市、区。下面是实际效果(oschina有上传大小限制,压缩后有水印,凑合看吧)

那么非要用本地省市区数据呢?更简单了,视图加载的时候把省市区从本地文件中读取出来存到三个String数组里,全setDisplayedValues就完了,都用不到OnValueChangedListener。获取Picker的值用getValue就可以了

ed5514b27c556bb24084dca929290d4e.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值