Android DatePicker字体
我知道你可以将自定义的TypeFace应用于Android中的TextView,如下所示:
TextView tv = findViewById(R.id.textview01); Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BLACKROSE.TTF"); tv.setTypeface(tf);
有没有办法做到这一点DatePicker?
看看源代码后,Datepicker小部件包含3个NumberPicker小部件(用于日,月,年),而小部件又包含TextView。 所以你必须在DatePicker里的NumberPickers里设置TextView的字体。
我认为你必须得到NumberPicker和DatePicker的源代码,并修改源代码来实现这一点,恐怕说起来容易做起来难。
这是我的代码。 我希望对某人有用。
DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker1); LinearLayout layout1 = (LinearLayout) datePicker.getChildAt(0); LinearLayout layout = layout1.getChildAt(0); // day LinearLayout day = (LinearLayout) layout.getChildAt(0); setNumberPicker(day); // month LinearLayout month = (LinearLayout) layout.getChildAt(1); setNumberPicker(month); // year LinearLayout year = (LinearLayout) layout.getChildAt(2); setNumberPicker(year);
…
private void setNumberPicker(LinearLayout ll) { ((ImageButton) ll.getChildAt(0)).setBackgroundResource(R.drawable.plus_button); ((ImageButton) ll.getChildAt(2)).setBackgroundResource(R.drawable.minus_button); EditText et = (EditText) ll.getChildAt(1); et.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); et.setTypeface(youtTypeface); }
这是我的解决方案:
private void overrideFonts(View v) { ViewGroup picker; try { picker = (DatePicker) v; } catch (Exception e) { picker = (TimePicker) v; } LinearLayout layout1 = (LinearLayout) picker.getChildAt(0); if (picker instanceof TimePicker) { if (layout1.getChildAt(1) instanceof NumberPicker) { NumberPicker v1 = (NumberPicker) layout1.getChildAt(1); final int count = v1.getChildCount(); for (int i = 0; i < count; i++) { View child = v1.getChildAt(i); try { Field wheelpaint_field = v1.getClass().getDeclaredField("mSelectorWheelPaint"); wheelpaint_field.setAccessible(true); ((Paint) wheelpaint_field.get(v1)).setTypeface(//your font here); ((Paint) wheelpaint_field.get(v1)).setColor(getResources().getColor(R.color.colorOrange)); ((EditText) child).setTypeface(// your font here); v1.invalidate(); } catch (Exception e) { //TODO catch. //If java cant find field then it will catch here and app wont crash. } } } } LinearLayout layout = (LinearLayout) layout1.getChildAt(0); for (int j = 0; j < 3; j++) { try { if (layout.getChildAt(j) instanceof NumberPicker) { NumberPicker v1 = (NumberPicker) layout.getChildAt(j); final int count = v1.getChildCount(); for (int i = 0; i < count; i++) { View child = v1.getChildAt(i); try { Field wheelpaint_field = v1.getClass().getDeclaredField("mSelectorWheelPaint"); wheelpaint_field.setAccessible(true); ((Paint) wheelpaint_field.get(v1)).setTypeface(//your font here); ((Paint) wheelpaint_field.get(v1)).setColor(getResources().getColor(R.color.colorOrange)); ((EditText) child).setTypeface(//your font here); v1.invalidate(); } catch (Exception e) { //TODO catch. //If java cant find field then it will catch here and app wont crash. } } } } catch (Exception e) { //TODO catch. //If java cant find field then it will catch here and app wont crash. } } }
如果你可以使用DatePickerDialog,那么你可以简单地获取对话框的按钮,如:
DatePickerDialog datePickerDialog; // GET your dialog datePickerDialog.show(); datePickerDialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextSize(30); // 30 is your text size datePickerDialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextSize(30);
相当于SKG解决方案的Kotlin-Anko
startTimePicker = timePicker { this.applyRecursively { when(it) { is NumberPicker -> { val paintField = it.javaClass.getDeclaredField("mSelectorWheelPaint") paintField.isAccessible = true (paintField.get(it) as? Paint)?.typeface = //your font here } is TextView -> { it.typeface = //your font here } } }
- 如何在kotlin-android编译之前处理重复的类?
- 在Before方法中,ActivityTestRule.getActivity返回null
- 用消息“此处不允许的方法”来改写响应代码405
- 自定义视图不是在Android中绘制的
- Kotlin在GridLayout单元格的底部显示一个边框
- com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_ARRAY,但在第1行第2列的路径
- 在同步gradle – NullPointerException之后,ButterKnife不绑定视图
- 在子模块中的Android数据绑定
- 在Instant App中应用插件“kotlin-android”会导致“null不能转换为非空类型的com.android.build.gradleBasePlugin”