通过反射修改TimePicker

本文介绍如何使用Android系统原生组件TimePicker,并通过反射机制自定义其样式,包括隐藏冒号、设置分割线颜色及高度等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private void getTime(){
		mTimePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);  //设置点击事件不弹键盘
        Resources resources = Resources.getSystem();
        int hour = resources.getIdentifier("hour", "id", "android");
        int min = resources.getIdentifier("minute", "id", "android");
        NumberPicker mHourNumberPicker = (NumberPicker)mTimePicker.findViewById(hour);
        NumberPicker mMinNumberPicker = (NumberPicker)mTimePicker.findViewById(min);
        mHourNumberPicker.setBackgroundColor(getResources().getColor(R.color.color)); //设置时间条的背景颜色为透明
        mMinNumberPicker.setBackgroundColor(getResources().getColor(R.color.color));
    }

设置分割线的:

    private void setNumberPickerDivider(NumberPicker numberPicker) {
        NumberPicker picker = numberPicker;
        Field[] pickerFields = NumberPicker.class.getDeclaredFields();
        for (Field pf : pickerFields) {
            if (pf.getName().equals("mSelectionDivider")) {  //设置颜色
                pf.setAccessible(true);
                ColorDrawable colorDrawable = new ColorDrawable(
                        ContextCompat.getColor(this, R.color.colorAccent)); //选择自己喜欢的颜色
                try {
                    pf.set(numberPicker, colorDrawable);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            if (pf.getName().equals("mSelectionDividerHeight")) {   //设置高度
                pf.setAccessible(true);
                try {
                    int result = 3;  //要设置的高度
                    pf.set(picker, result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            }
            picker.invalidate();
        }
    }

隐藏冒号:

    private void setTime(){
        ViewGroup view = (ViewGroup) mTimePicker.getChildAt(0);//获取子view(TimePicker)
        ViewGroup view2 = (ViewGroup) view.getChildAt(0);//获取TimePicker的第0的子view  时间部分
        view2.getChildAt(1).setVisibility(View.GONE);
    }

完整代码:

import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.NumberPicker;
import android.widget.TimePicker;

import java.lang.reflect.Field;

public class MainActivity extends AppCompatActivity {
private TimePicker mTimePicker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTimePicker = (TimePicker)findViewById(R.id.lala);
    mTimePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);  //设置点击事件不弹键盘
    getTime();
    setTime();
}
private void getTime(){
    Resources resources = Resources.getSystem();
    int hour = resources.getIdentifier("hour", "id", "android");
    int min = resources.getIdentifier("minute", "id", "android");
    NumberPicker mHourNumberPicker = (NumberPicker)mTimePicker.findViewById(hour);
    NumberPicker mMinNumberPicker = (NumberPicker)mTimePicker.findViewById(min);
    mHourNumberPicker.setBackgroundColor(getResources().getColor(R.color.color)); //设置时间条的背景颜色为透明
    mMinNumberPicker.setBackgroundColor(getResources().getColor(R.color.color));
    setNumberPickerDivider(mHourNumberPicker);
}
private void setTime(){
    ViewGroup view = (ViewGroup) mTimePicker.getChildAt(0);
    ViewGroup view2 = (ViewGroup) view.getChildAt(0);
    view2.getChildAt(1).setVisibility(View.GONE);
}

private void setNumberPickerDivider(NumberPicker numberPicker) {
    NumberPicker picker = numberPicker;
    Field[] pickerFields = NumberPicker.class.getDeclaredFields();
    for (Field pf : pickerFields) {
        if (pf.getName().equals("mSelectionDivider")) {  //设置颜色
            pf.setAccessible(true);
            ColorDrawable colorDrawable = new ColorDrawable(
                    ContextCompat.getColor(this, R.color.colorAccent)); //选择自己喜欢的颜色
            try {
                pf.set(numberPicker, colorDrawable);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        if (pf.getName().equals("mSelectionDividerHeight")) {   //设置高度
            pf.setAccessible(true);
            try {
                int result = 3;  //要设置的高度
                pf.set(picker, result);
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        }
        picker.invalidate();
    }
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值