android timepicker 可以显示秒数吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android timepicker 可以显示秒数吗相关的知识,希望对你有一定的参考价值。

android组件TimePicker组件的深入解析,自定义TimePicker组件,实现时间的秒数只显示00或者30,实现时间的整点选择或半点选择
上截图(注意文章中有些截图没上,如果想看请下载附件里面的文档)

大家注意设置时间的时候分钟只能设置00或者30,这就是我自定义的,因为最近公司有这样的属性,需要用户提交的时间是整点或者半点

<!--[if !supportLists]-->1. <!--[endif]-->TimePicker组件其实继承FrameLayout的,可以算的上是一个布局,就像那些TabHost等等的布局一样
<!--[if !supportLists]-->2. <!--[endif]-->在TimePicker的构造函数里面,
public TimePicker(Context context, AttributeSet attrs, int defStyle)
我们看到了这样的代码
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.time_picker,this, // we are the parent
true);
一看我们就应该知道了,其实TimePicker也是一种布局,而且他有自己的布局文件R.layout.time_picker
其实在这个构造函数里面我们知道,android的底层其实也是调用java的
// initialize to current time
Calendar cal = Calendar.getInstance();
这个函数来获取时间的
// by default we're not in 24 hour mode
setCurrentHour(cal.get(Calendar.HOUR_OF_DAY));
setCurrentMinute(cal.get(Calendar.MINUTE));
初始化时间
<!--[if !supportLists]-->3. <!--[endif]-->关于在TimePicker的构造函数里加载的R.layout.time_picker我们打开android的平台文件夹
如:
F:\android-sdk-windows\platforms\android-8\data\res\layout在此文件夹下面我们找到了time_picker.xml文件,打开此布局文件我们看到了两个NumberPicker元属和一个Button元属,此控件的效果图就是这样的(注意此处截图没上,如果需要请下载附件的文档)
用过TimePicker控件的朋友应该知道,此控件会自动生成一个按钮,此按钮是显示AM/PM的,其实我们也可以通过函数
TimePicker.setIs24HourView(true);//设置时间格式为24小时制
来设置TimePicker的时间显示方法,默认情况下此属性值为false

<!--[if !supportLists]-->4. <!--[endif]-->分析NumberPicker组件,我们找到android的源码找到NumberPicker.java在此类里面我们看到了此类其实是继承LinearLayout由此可知,其实NumberPicker组件也是一个布局元属
在NumberPicker的构造函数里面我们同样看到了
LayoutInflater inflater=(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.number_picker, this, true);
这样的代码,由此我们找到R.layout.number_picker布局文件
<!--[if !supportLists]-->5. <!--[endif]-->分析R.layout.number_picker文件
如:F:\android-sdk-windows\platforms\android-8\data\res\layout在这样的路径下面我们可以找到R.layout.number_picker.xml布局文件 打开此布局文件,我们看到这样的代码
有两个NumberPickerButton和一个EditText其实分析我们不难知道其实这个布局文件生成的样式就是这样的

<!--[if !supportLists]-->6. <!--[endif]-->说了这么多下面我来说重点了,其实我们每次点击+或-都会触发这个监听函数
setOnTimeChangedListener所以如果我们需要对时间进行定制的话,我们可以使用此监听器来做一些事情此监听器会插入三个参数很好的是他把TimePicker对象也传入进来了
public void onTimeChanged(TimePicker view, int hourOfDay, int minute)
下面我来说个业务需求
我们要为用户提供一个选择时间的界面,但用户选择时间秒的时候用户只有两个选择要是秒是00,如
要么秒是30,如
我们该如何来做出这样的应用了,下面我就告诉大家我是如何做出这样的应用的
通过上面我们对TimePicker的源码架构分析可以知道其实我们只要通过java强大的反射机制来修改源码里面的一些属性值就可以做到了
参考技术A android自带的timePicker不行,android源代码只提供了显示和更新小时数/分钟数/AM/PM的方法。要显示秒数的话需要自己写相应代码

在android中以分钟间隔显示TimePicker

【中文标题】在android中以分钟间隔显示TimePicker【英文标题】:Show TimePicker with minutes intervals in android 【发布时间】:2013-12-11 10:43:18 【问题描述】:

我的应用程序显示一个 TimePickerDialog 来设置时间。 我希望 timePickerDialog 以 5 分钟的间隔显示分钟。

这段代码可以正常工作:

private final int TIME_PICKER_INTERVAL=5;
private boolean mIgnoreEvent=false;
…
    public TimePickerDialogs(Context arg0, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) 
    super(arg0, callBack, hourOfDay, minute, is24HourView);

    formato=Statics.formato;


@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) 
    //super.onTimeChanged(arg0, arg1, arg2);

    if (mIgnoreEvent)
        return;
    if (minute%TIME_PICKER_INTERVAL!=0)
        int minuteFloor=minute-(minute%TIME_PICKER_INTERVAL);
        minute=minuteFloor + (minute==minuteFloor+1 ? TIME_PICKER_INTERVAL : 0);
        if (minute==60)
            minute=0;
        mIgnoreEvent=true;
        view.setCurrentMinute(minute);
        mIgnoreEvent=false;
    

虽然只能以五分钟为间隔选择分钟,但时间选择器对话框如下所示:

不知道分钟怎么也显示5分钟的范围,如下图:

我已经搜索过,但找不到解决方案。

【问题讨论】:

这应该可以帮助你:***.com/questions/16187341/… 我已经知道答案了,问题是我使用 timePickerDialog 在 xml 中没有 TimePicker 来调用 (... findViewById) 在我看来,如果您在带有数字选择器的自定义布局 xml 中执行此操作,那么所有的答案都太复杂了。我只是看不出使用 CustomTimePickerDialog 这种方法的原因 【参考方案1】:

使用下面的自定义类CustomTimePickerDialog,我认为它可以解决你的问题。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.NumberPicker;
import android.widget.TimePicker;

public class CustomTimePickerDialog extends TimePickerDialog 

    private final static int TIME_PICKER_INTERVAL = 5;
    private TimePicker mTimePicker;
    private final OnTimeSetListener mTimeSetListener;

    public CustomTimePickerDialog(Context context, OnTimeSetListener listener,
            int hourOfDay, int minute, boolean is24HourView) 
        super(context, TimePickerDialog.THEME_HOLO_LIGHT, null, hourOfDay,
                minute / TIME_PICKER_INTERVAL, is24HourView);
        mTimeSetListener = listener;
    

    @Override
    public void updateTime(int hourOfDay, int minuteOfHour) 
        mTimePicker.setCurrentHour(hourOfDay);
        mTimePicker.setCurrentMinute(minuteOfHour / TIME_PICKER_INTERVAL);
    

    @Override
    public void onClick(DialogInterface dialog, int which) 
        switch (which) 
            case BUTTON_POSITIVE:
                if (mTimeSetListener != null) 
                    mTimeSetListener.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
                            mTimePicker.getCurrentMinute() * TIME_PICKER_INTERVAL);
                
                break;
            case BUTTON_NEGATIVE:
                cancel();
                break;
        
    

    @Override
    public void onAttachedToWindow() 
        super.onAttachedToWindow();
        try 
            Class<?> classForid = Class.forName("com.android.internal.R$id");
            Field timePickerField = classForid.getField("timePicker");
            mTimePicker = (TimePicker) findViewById(timePickerField.getInt(null));
            Field field = classForid.getField("minute");

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

这是演示截图。

【讨论】:

NumberPicker 在预蜂窝中不可用。建议我一些解决方案 我可以在 15 分钟间隔内工作,但不能在 30 分钟间隔内工作 好的,我设法通过添加最后保存小时和分钟的 onTimeChanged 检查来解决 30 分钟的间隔。如果两者不同,它只会更改分钟而不是使用view.setCurrentHour(lastSavedHour)。我不确定这是否是一种好方法......但如果有更好的解决方案,请随时告诉我:) @LeonLucardie 如果您将超级调用更改为 super(context, TimePickerDialog.THEME_HOLO_LIGHT, callBack, hourOfDay, minute, is24HourView); ,它将适用于 Android 5.0。传递主题使其使用选择器样式 timeDialog。我已经提交了对答案的修改。 我觉得这将在未来打破 - 谷歌正在限制通过反射访问内部:(【参考方案2】:

这个很棒的库 MaterialDateTimePicker 可以创建漂亮的风格材质时间选择器。

您可以使用以下方法之一来定义您的间隔:

setSelectableTimes(Timepoint[] times) 你可以传入一个时间点数组。这些值是选择器中唯一有效的选择。 setMinTime(Timepoint time) 和 setMaxTime(Timepoint time) 将进一步 修剪这个列表。

setTimeInterval(int hourInterval, int minuteInterval, int secondInterval) 设置可选时间间隔 时间选择器对话框。这是一个方便的包装 setSelectableTimes

【讨论】:

该库是在其中包含另一个视图的片段上工作,还是仅作为对话框工作? @JohnSardinha,它是一个基于相应Android api的对话框,但需要一个FragmentManager的实例来实现它的show()函数。 这个库适合我。解决了我的问题。例如,我可以设置 30 分钟的间隔。 可以自定义这个库以使用微调器而不是时钟吗?我见过的大多数解决方案似乎都使​​用反射,并且它们不适用于所有 android 版本。【参考方案3】:

正如@anddev84 所说,您可以使用自己定制的 TimePickerDialog 来做到这一点。

不过,看看你能找到的源代码:

    TimePickerDialog 是一个框架布局,请参见file。它只包含一个 TimePicker TimePicker 小部件只是一个线性布局,请参阅file。你可以看到分钟微调器是一个 NumberPicker

    参考NumberPicker的代码,你会发现它有一个公共方法setDisplayedValues(String[] displayValues)

    /**
     * Sets the values to be displayed.
     *
     * @param displayedValues The displayed values.
     */
    public void setDisplayedValues(String[] displayedValues)
    

因此,有了这些信息,我想您可以简单地自定义您自己的时间选择器对话框,显示有限的分钟数。

【讨论】:

【参考方案4】:
/**
 * Set TimePicker interval by adding a custom minutes list
 *
 * @param timePicker
 */
private void setTimePickerInterval(TimePicker timePicker) 
    try 

        NumberPicker minutePicker = (NumberPicker) timePicker.findViewById(Resources.getSystem().getIdentifier(
                "minute", "id", "android"));
        minutePicker.setMinValue(0);
        minutePicker.setMaxValue((60 / TIME_PICKER_INTERVAL) - 1);
        List<String> displayedValues = new ArrayList<String>();
        for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) 
            displayedValues.add(String.format("%02d", i));
        
        minutePicker.setDisplayedValues(displayedValues.toArray(new String[0]));
     catch (Exception e) 
        Log.e(TAG, "Exception: " + e);
    

【讨论】:

【参考方案5】:

挣扎于 30 分钟的间隔超过一小时。如果看不到@Lee 的评论,可能会更加挣扎。所以只需以 30 分钟的间隔发布完整的对话代码:

public class IntervalTimePickerDialog extends TimePickerDialog 
    private static final String TAG = "IntervalPickerDialog";

    private final static int TIME_PICKER_INTERVAL = 30;
    private TimePicker timePicker;
    private final OnTimeSetListener callback;

    private int lastHour = -1;
    private int lastMinute = -1;

    public IntervalTimePickerDialog(Context context, int themeId, OnTimeSetListener callBack,
                                    int hourOfDay, int minute, boolean is24HourView) 
        super(context, themeId, callBack, hourOfDay, minute / TIME_PICKER_INTERVAL,
                is24HourView);
        lastHour = hourOfDay;
        lastMinute = minute;
        this.callback = callBack;
    

    @Override
    public void onClick(DialogInterface dialog, int which) 
        if (callback != null && timePicker != null) 
            timePicker.clearFocus();
            callback.onTimeSet(timePicker, timePicker.getCurrentHour(),
                    timePicker.getCurrentMinute() * TIME_PICKER_INTERVAL);
        
    

    @Override
    protected void onStop() 
    

    @Override
    public void onAttachedToWindow() 
        super.onAttachedToWindow();
        try 
            Class<?> classForid = Class.forName("com.android.internal.R$id");
            Field timePickerField = classForid.getField("timePicker");
            this.timePicker = (TimePicker) findViewById(timePickerField.getInt(null));
            Field field = classForid.getField("minute");

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

    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) 
        super.onTimeChanged(view, hourOfDay, minute);
        if (lastHour != hourOfDay && lastMinute != minute) 
            view.setCurrentHour(lastHour);
            lastMinute = minute;
         else 
            lastHour = hourOfDay;
            lastMinute = minute;
        
    

【讨论】:

谁能帮我如何调用这个类。 bcz 我只是在调用这个构造函数并调用方法 dialog.show()。但是出现异常 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid;您的活动正在进行吗? @Yevhenii Kanivets,Android 9 出现此错误,请提供任何帮助。 java.lang.NoSuchFieldException: TimePicker @user1510006 他们刚刚将字段的名称更改为另一个(不知道哪个是新名称)。这正是为什么反射是不好的解决方案。 @Yevhenii Kanivets ,感谢您的回复,那么,我们还有其他解决方案来保留微调器 UI 吗?【参考方案6】:

查看TimePickerDialog 的代码,他们似乎没有为您提供在TimePicker 显示给用户之前直接修改它的方法,并且您会看到图片中显示的“错误分钟” .见TimePickerDialog.java

我的建议是创建您自己的 TimePickerDialog,基于 Android 的设计。起初听起来可能令人生畏,但

    这样您就可以根据需要自定义实现,包括初始化TimePicker 值以显示分钟(如here 所述),以及 其实应该不难,Android TimePickerDialog.java 本身只有 160 行,非常好管理。

【讨论】:

【参考方案7】:

我已对上述出色的公认答案进行了补充。问题在于,至少在某些版本的 Android 中,当您更改所选时间时,它会将对话框标题替换为不正确的时间值。您不能覆盖有问题的方法 updateTitle(),但您可以在 onTimeChanged() 处拦截调用,并且不调用 super 或使用固定参数调用它。

我不知道是否使用非零字符串 ID 调用了 setTitle() 方法,但你可以只为布尔值本身或其他什么设置一个 getter/setter。

@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute)

    if (autoTitle)
    
        // Super will call a private updateTitle() method, so lets make
        // sure it has the right minute value.
        super.onTimeChanged(view, hourOfDay, minute * TIME_PICKER_INTERVAL);
    
    else
    
        // do nothing
    


@Override
public void setTitle(int id)

    super.setTitle(id);
    autoTitle = (id == 0);


...

private boolean autoTitle = true;

【讨论】:

【参考方案8】:

到目前为止,解决方案不适用于侦听器,也不适用于以编程方式设置时间。 该解决方案完全可用且稳定。还有 Kotlin...

import android.content.Context
import android.util.AttributeSet
import android.widget.NumberPicker
import android.widget.TimePicker
import androidx.databinding.BindingAdapter
import java.lang.reflect.Field
import java.util.*


class TimePickerInterval @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TimePicker(context, attrs, defStyleAttr) 

    private var MINUTE_INTERVAL = 1
    override fun getCurrentMinute(): Int 
        return super.getCurrentMinute() * MINUTE_INTERVAL
    

    override fun getMinute(): Int 
        return super.getMinute() * MINUTE_INTERVAL
    

    override fun onAttachedToWindow() 
        super.onAttachedToWindow()
        setUp()
    

    private fun setUp() 
        try 
            val classForid = Class.forName("com.android.internal.R\$id")
            val field: Field = classForid.getField("minute")
            val mMinuteSpinner = findViewById<NumberPicker>(field.getInt(null))
            mMinuteSpinner.minValue = 0
            mMinuteSpinner.maxValue = 60 / MINUTE_INTERVAL - 1
            val displayedValues: MutableList<String> = ArrayList()
            var i = 0
            while (i < 60) 
                displayedValues.add(String.format("%02d", i))
                i += MINUTE_INTERVAL
            
            mMinuteSpinner.displayedValues = displayedValues.toTypedArray()

         catch (e: Exception) 
            e.printStackTrace()
        
    

    override fun setOnTimeChangedListener(onTimeChangedListener: OnTimeChangedListener) 
        super.setOnTimeChangedListener  tp, hour, minute ->
            onTimeChangedListener.onTimeChanged(tp, hour, minute * MINUTE_INTERVAL)
        
    

    override fun setMinute(minute: Int) 
        super.setMinute(minute/MINUTE_INTERVAL)
    

    companion object 
        @JvmStatic
        @BindingAdapter("time_picker_set_minute_interval")
        fun setInterval(view: TimePickerInterval, interval: Int?) 
            interval?.let 
                view.MINUTE_INTERVAL = interval
                view.setUp()
            
        
    

在您的 XML 中:

        <your.path.TimePickerInterval
            android:id="@+id/tp_to"
            android:layout_
            android:layout_
            android:timePickerMode="spinner"
            time_picker_set_minute_interval="@5"
 />

【讨论】:

【参考方案9】:

上面的答案对于旧版本的 Android 非常有效,但它在 Android 7 Nougat 中对我不起作用,基本上日期选择器完全更改为使用时钟模式......我有点合并建议的代码这里是https://gist.github.com/jeffdgr8/6bc5f990bf0c13a7334ce385d482af9f,然后它默认设置 TimePickerDialog 的模式以显示 Spinner 控件,并在我的情况下运行代码以仅显示 15 分钟的间隔。

代码贴在这里https://gist.github.com/smaugho/14dae83f3284fa05455ee0a9e4f13099

public class CustomTimePickerDialog extends TimePickerDialog 

private final static int TIME_PICKER_INTERVAL = 15;
private TimePicker timePicker;
private final OnTimeSetListener callback;

  public HorekoTimePicker(Context context,
        OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) 
      super(context, callBack, hourOfDay, minute/TIME_PICKER_INTERVAL, is24HourView);
      this.callback = callBack;
    fixSpinner(context, hourOfDay, minute, is24HourView);
  

/**
 * Workaround for this bug: https://code.google.com/p/android/issues/detail?id=222208
 * In Android 7.0 Nougat, spinner mode for the TimePicker in TimePickerDialog is
 * incorrectly displayed as clock, even when the theme specifies otherwise, such as:
 *
 *  <resources>
 *      <style name="Theme.MyApp" parent="Theme.AppCompat.Light.NoActionBar">
 *          <item name="android:timePickerStyle">@style/Widget.MyApp.TimePicker</item>
 *      </style>
 *
 *      <style name="Widget.MyApp.TimePicker" parent="android:Widget.Material.TimePicker">
 *          <item name="android:timePickerMode">spinner</item>
 *      </style>
 *  </resources>
 *
 * May also pass TimePickerDialog.THEME_HOLO_LIGHT as an argument to the constructor,
 * as this theme has the TimePickerMode set to spinner.
 *
 * Taken from: https://gist.github.com/jeffdgr8/6bc5f990bf0c13a7334ce385d482af9f
 */
private void fixSpinner(Context context, int hourOfDay, int minute, boolean is24HourView) 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)  // android:timePickerMode spinner and clock began in Lollipop
        try 

            // Get the theme's android:timePickerMode
            final int MODE_SPINNER = 1;
            Class<?> styleableClass = Class.forName("com.android.internal.R$styleable");
            Field timePickerStyleableField = styleableClass.getField("TimePicker");
            int[] timePickerStyleable = (int[]) timePickerStyleableField.get(null);
            final TypedArray a = context.obtainStyledAttributes(null, timePickerStyleable, android.R.attr.timePickerStyle, 0);
            Field timePickerModeStyleableField = styleableClass.getField("TimePicker_timePickerMode");
            int timePickerModeStyleable = timePickerModeStyleableField.getInt(null);
            final int mode = a.getInt(timePickerModeStyleable, MODE_SPINNER);
            a.recycle();

            if (mode == MODE_SPINNER) 

                timePicker = (TimePicker) findField(TimePickerDialog.class, TimePicker.class, "mTimePicker").get(this);
                Class<?> delegateClass = Class.forName("android.widget.TimePicker$TimePickerDelegate");
                Field delegateField = findField(TimePicker.class, delegateClass, "mDelegate");
                Object delegate = delegateField.get(timePicker);
                Class<?> spinnerDelegateClass;
                if (Build.VERSION.SDK_INT != Build.VERSION_CODES.LOLLIPOP) 
                    spinnerDelegateClass = Class.forName("android.widget.TimePickerSpinnerDelegate");
                 else 
                    // TimePickerSpinnerDelegate was initially misnamed TimePickerClockDelegate in API 21!
                    spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate");
                

                // In 7.0 Nougat for some reason the timePickerMode is ignored and the delegate is TimePickerClockDelegate
                if (delegate.getClass() != spinnerDelegateClass) 
                    delegateField.set(timePicker, null); // throw out the TimePickerClockDelegate!
                    timePicker.removeAllViews(); // remove the TimePickerClockDelegate views
                    Constructor spinnerDelegateConstructor = spinnerDelegateClass.getConstructor(TimePicker.class, Context.class, AttributeSet.class, int.class, int.class);
                    spinnerDelegateConstructor.setAccessible(true);
                    // Instantiate a TimePickerSpinnerDelegate
                    delegate = spinnerDelegateConstructor.newInstance(timePicker, context, null, android.R.attr.timePickerStyle, 0);
                    delegateField.set(timePicker, delegate); // set the TimePicker.mDelegate to the spinner delegate
                    // Set up the TimePicker again, with the TimePickerSpinnerDelegate
                    timePicker.setIs24HourView(is24HourView);
                    timePicker.setCurrentHour(hourOfDay);
                    timePicker.setCurrentMinute(minute);
                    timePicker.setOnTimeChangedListener(this);
                

                setTimeIntervals();
            

         catch (Exception e) 
            throw new RuntimeException(e);
        
    


private static Field findField(Class objectClass, Class fieldClass, String expectedName) 
    try 
        Field field = objectClass.getDeclaredField(expectedName);
        field.setAccessible(true);
        return field;
     catch (NoSuchFieldException e)  // ignore
    // search for it if it wasn't found under the expected ivar name
    for (Field searchField : objectClass.getDeclaredFields()) 
        if (searchField.getType() == fieldClass) 
            searchField.setAccessible(true);
            return searchField;
        
    
    return null;


  @Override
protected void onStop()  

/*
 * Feature #363: (Un)availability times in 15min interval
 * https://abix.webhop.net/redmine/issues/363
 * Solution extracted from
 * http://***.com/questions/20214547/show-timepicker-with-minutes-intervals-in-android
 */

@Override
public void onClick(DialogInterface dialog, int which) 
    super.onClick(dialog, which);

    if (callback != null && timePicker != null) 
        timePicker.clearFocus();
        callback.onTimeSet(timePicker, timePicker.getCurrentHour(),
            timePicker.getCurrentMinute()*TIME_PICKER_INTERVAL);
    


private void setTimeIntervals() 
    try 
        Class<?> classForid = Class.forName("com.android.internal.R$id");
        Field field = classForid.getField("minute");

        NumberPicker mMinuteSpinner = (NumberPicker) timePicker.findViewById(field.getInt(null));
        mMinuteSpinner.setMinValue(0);
        mMinuteSpinner.setMaxValue((60 / TIME_PICKER_INTERVAL) - 1);
        List<String> displayedValues = new ArrayList<String>();
        for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) 
            displayedValues.add(String.format("%02d", i));
        
        mMinuteSpinner.setDisplayedValues(displayedValues.toArray(new String[0]));

     catch (Exception e) 
        e.printStackTrace();
    


【讨论】:

@Adrián Rivero: java.lang.NoSuchFieldException: TimePicker with Android 9 。我收到此错误,请提供任何帮助。 @user1510006 尝试从 catch 块中删除行 ` throw new RuntimeException(e);` 这将起作用【参考方案10】:

如果您不想在 android 5+ 中使用相同的时间选择器(不是时钟)对话框,只需更改主题即可。可以直接在构造函数中更改:

 public CustomTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView, int time_interval) 
        super(context, TimePickerDialog.THEME_HOLO_LIGHT, callBack, hourOfDay, minute / time_interval, is24HourView);
        this.TIME_PICKER_INTERVAL = time_interval;
        this.callback = callBack;
    

【讨论】:

【参考方案11】:

根据上面显示的 Tanmay Mandal 的回答,我已经为 TimePicker Widget(而不是 TimePickerDialog)实现了一个解决方案。这里的技巧是用 Activity 布局中的原始 TimePicker 元素替换 LinearLayout 元素,以便以编程方式添加我们的自定义 TimePicker。请参见下面的示例:

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.widget.NumberPicker;
import android.widget.TimePicker;

public class MyTimePicker extends TimePicker 

  private static final int TIME_PICKER_INTERVAL = 5;

    public MyTimePicker(Context context) 
        super(context);
    

    @Override
    public Integer getCurrentMinute() 
        return super.getCurrentMinute()*TIME_PICKER_INTERVAL;
    

    @Override
    protected void onAttachedToWindow() 
        super.onAttachedToWindow();

        try 
            Class<?> classForid = Class.forName("com.android.internal.R$id");
            Field field = classForid.getField("minute");

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

   


对于我们的活动:

          @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

            LinearLayout ll = (LinearLayout) findViewById(R.id.myLinearLayout);
            ll.removeAllViews();
            MyTimePicker tp = new MyTimePicker(this);
            tp.setIs24HourView(true);
            Calendar cal = Calendar.getInstance(); // Current time
        tp.setCurrentHour(cal.get(Calendar.HOUR_OF_DAY));
            tp.setCurrentMinute(cal.get(Calendar.MINUTE)/5); // Aprox current minute
            ll.addView(tp);


【讨论】:

你的 TimePicker 类有错误: NumberPicker mMinuteSpinner = (NumberPicker) mMinuteSpinner.setMinValue(0); Ups,你是对的。我忘记了一个代码行。错误现已解决。谢谢! 这是如何附加到 UI 上的,我需要在我的 xml 布局中启用时间选择器吗? 您的 xml 布局中不需要任何 TimePicker。只需在 TimePicker 所在的位置放置一个 LinearLayout 元素,然后让 Activity 填充它,如上所示。

以上是关于android timepicker 可以显示秒数吗的主要内容,如果未能解决你的问题,请参考以下文章

Android 6.0 中TimePicker显示为滚动样式的方法

Android TimePicker 在横向模式下无法很好地显示

Android自学日记使用DatePicker以及TimePicker显示当前日期和时间

我可以自定义 Android 默认提供的 TimePicker 或 DatePicker 吗?

Android攻城狮datePicke&timePicker

Android - 新的日历样式 DatePicker 和 TimePicker