【问题标题】:TimePickerDialog with old style and different color具有旧样式和不同颜色的 TimePickerDialog
【发布时间】:2017-04-20 09:01:46
【问题描述】:

我创建了一个 TimePickerDialog 并更改了默认颜色。另外,我想把样式改成不同的样式。

我找不到同时更改颜色和样式的方法。

这就是我创建 TimePickerDialog 的方式:

TimePickerDialog 代码:

public void showHourPicker() {
    final Calendar myCalender = Calendar.getInstance();
    int hour = myCalender.get(Calendar.HOUR_OF_DAY);
    int minute = myCalender.get(Calendar.MINUTE);
    TimePickerDialog.OnTimeSetListener myTimeListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            if (view.isShown()) {
                myCalender.set(Calendar.HOUR_OF_DAY, hourOfDay);
                myCalender.set(Calendar.MINUTE, minute);
                updateHourEditText(myCalender);
            }
        }
    };
    TimePickerDialog timePickerDialog = new TimePickerDialog(getContext(),R.style.TimePickerDialogStyle , myTimeListener, hour, minute, true);
    timePickerDialog.setTitle("Choose hour:");
    timePickerDialog.show();
}

这就是它的风格:

<style name="TimePickerDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorControlActivated">@color/mcgpalette_300</item>
    <item name="colorAccent">@color/mcgpalette_300</item>
</style>

我得到的 TimePickerDialog 看起来像:

如果我尝试更改样式,如下图所示,我得到了我想要的样式,但不是上例中的颜色。 良好风格的代码,但没有我的颜色:

TimePickerDialog timePickerDialog = new TimePickerDialog(getContext(), 2 , myTimeListener, hour, minute, true);

我的问题是:如何将样式设置为第二张图片,颜色设置为第一张图片?

【问题讨论】:

    标签: android android-styles android-timepicker timepickerdialog


    【解决方案1】:

    如何将样式设置为第二张图片,颜色设置为第一张图片?

    您需要进行一些反思,因为没有用于此的公共 API。

    无聊的东西,你可以跳过。

    一些内部结构:

    • 在 API 21 之下,第二种样式又名“微调器模式”是唯一可用的样式。由于 API 21 提供了另一种“时钟模式”,并且TimePicker 小部件根据您选择的样式将工作委托给内部类。

    • 微调器模式由多个NumberPicker 小部件组成。

    为了实现你想要的,你需要:

    1. 检查您是在 API 21 下还是在 API 21 之上并使用微调器模式(并实现时钟和微调器委托的类名已启用 API 21,啊)。
    2. 获得对所有NumberPickers 的访问权限。
    3. 访问这些NumberPickers 的分隔线。
    4. 用新颜色为分隔可绘制对象着色。

    这里有好东西。

    由于实际的实现需要很长的页面,因此我将发布链接:

    • XpNumberPicker 允许更改任何 NumberPicker 的分隔线(或只是分隔线颜色)。
    • XpDatePicker 允许更改任何微调器样式 DatePicker 的分隔线颜色。
    • XpTimePicker 允许更改任何微调器样式 TimePicker 的分隔线颜色。

    将所有这些类复制到您的项目中。

    您需要一个新分隔线颜色的ColorStateList。我将把这个交给你。

    例子:

    final int color = ContextCompat.getColor(timePicker.getContext(), R.color.accent);
    final ColorStateList csl = ColorStateList.valueOf(color);
    XpTimePicker.setSelectionDividerTint(timePicker, csl);
    

    问题。

    您无权从TimePickerDialog 访问TimePicker

    final int timePickerId = context.getResources().getIdentifier("android:id/timePicker", null, null);
    final TimePicker timePicker = (TimePicker) timePickerDialog.findViewById(timePickerId);
    

    我还没有测试过最后一点。

    标题。

    TimePickerDialog 扩展了Dialog,它使用低于 API 21 的 Holo 主题。这意味着你总是有蓝色标题和蓝色下划线。如何解决?

    • 通过调用timePickerDialog.setTitle(null)完全隐藏标题。
    • 手动方法。
      • 找到标题视图 (android:id/title) 并更改其文本颜色。
      • 找到分隔线视图 (android:id/titleDivider) 并更改其背景颜色。此 ID 不是公共 API 的一部分。
      • 如果对话框标题布局不是默认的 Holo,它可能没有这些视图!
    • 在 AppCOmpat 库提供的所有平台上使用 android.support.v7.app.AlertDialogTimePicker 作为 Material 主题。

    【讨论】:

      【解决方案2】:

      归根结底,TimePickerDialog 只是一个带有TimePicker 的警报对话框。您可以获取它的代码并使用 TimePicker 创建您自己的AlertDialog。这意味着您可以自定义时间选择器的任何属性。我建议您创建一个新的对话框 xml 并在您的自定义 AlertDialog 中添加它。确保使用您在 TimePickerDialog 中的布局调用 setView(View view)

      在本例中,我将 AM/PM 文本的颜色设置为橙色。

      <TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/timePicker"
          android:layout_gravity="center_horizontal"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:amPmTextColor="@android:color/holo_orange_light"
          android:timePickerMode="@integer/time_picker_mode" />
      

      【讨论】:

      • amPmTextColor 不影响微调器模式并在 API 21 中引入。
      猜你喜欢
      • 2020-12-16
      • 1970-01-01
      • 2012-06-16
      • 2020-05-21
      • 2017-11-09
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多