gpt4 book ai didi

java - 如何在 Android 的 TimePickerDialog 中设置自定义分钟间隔

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:35 24 4
gpt4 key购买 nike

我有一个 TimePickerDialog 用于设置时间,该时间设置为 TextView 以便显示它。现在,我需要帮助将 TimePicker(在 TimePickerDialog 内)分钟间隔设置为 15 分钟。我已经看到有一篇与 TimePicker 相关的 15 分钟间隔问题的帖子,但我不知道如何将它应用于 TimePickerDialog,因为我不知道如何使用它在 TimePickerDialog 中创建的 TimePicker。我是 Android 新手,完全迷失在这件事上。提前致谢。

最佳答案

使用 this 的组合来自@Rizwan 和 this其他线程,我提出了一个组合解决方案,允许在 TimePickerDialog 中进行任意分钟增量。主要问题是大部分功能都被 android TimePickerDialogTimePicker 类隐藏了,它似乎不允许

  1. 扩展 TimePickerDialog 让我们更容易访问
  2. 使用反射到达显示器内部并访​​问所需的位(见下文)
  3. 重新连接分钟“NumberPicker”以显示我们的值
  4. 重新连接 TimePicker 以从 NumberPicker 接收和返回值,以实现我们的自定义增量。
  5. 阻止 onStop() 以便它不会在关闭时重置值。

警告

到达 UI 内部的主要问题是元素由可能更改的 id 引用,甚至不能保证 id 的名称永远相同。话虽如此,这是一个有效的、稳定的解决方案,并且可能在可预见的 future 发挥作用。在我看来,空的 catch block 应该警告 UI 已经改变并且应该回退到默认(增加 1 分钟)行为。

解决方案

    private class DurationTimePickDialog extends TimePickerDialog
{
final OnTimeSetListener mCallback;
TimePicker mTimePicker;
final int increment;

public DurationTimePickDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, int increment)
{
super(context, callBack, hourOfDay, minute/increment, is24HourView);
this.mCallback = callBack;
this.increment = increment;
}

@Override
public void onClick(DialogInterface dialog, int which) {
if (mCallback != null && mTimePicker!=null) {
mTimePicker.clearFocus();
mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
mTimePicker.getCurrentMinute()*increment);
}
}

@Override
protected void onStop()
{
// override and do nothing
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
try
{
Class<?> rClass = Class.forName("com.android.internal.R$id");
Field timePicker = rClass.getField("timePicker");
this.mTimePicker = (TimePicker)findViewById(timePicker.getInt(null));
Field m = rClass.getField("minute");

NumberPicker mMinuteSpinner = (NumberPicker)mTimePicker.findViewById(m.getInt(null));
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue((60/increment)-1);
List<String> displayedValues = new ArrayList<String>();
for(int i=0;i<60;i+=increment)
{
displayedValues.add(String.format("%02d", i));
}
mMinuteSpinner.setDisplayedValues(displayedValues.toArray(new String[0]));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

}

constructor 接受增量值并保留一些其他引用。请注意,这忽略了错误检查,我们更喜欢 60%increment==0

onCreate 使用 UI 字段的名称和反射来发现当前位置。同样,这忽略了错误检查,并且应该是“故障安全”的,即如果出现问题,则恢复为默认行为。

onClick 被覆盖以将正确的分钟值返回给回调监听器

onStop 被覆盖以防止在对话框关闭时第二次返回(不正确的)索引值。继续,亲自尝试。

其中大部分来自对 TimePickerDialog 源代码的深入挖掘。

Android 11+ 更新

上例中使用的反射被标记为 greylist-max-q,这意味着在 Android 10 (API 29 - Q) 之后将不再可能。在短期内(直到 August 2021 )可以将目标版本降回 API 29,同时仍然针对 Android 11 (API 30 - R) 进行构建,但在此日期之后,Play 商店将不再接受这些构建并将需要API 30 作为构建目标。上面的警告中预料到并指出了这种最终失败。

关于java - 如何在 Android 的 TimePickerDialog 中设置自定义分钟间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com