【问题标题】:Show TimePicker with minutes intervals in android在android中以分钟间隔显示TimePicker
【发布时间】: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分钟的范围,如下图:

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

【问题讨论】:

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

标签: android intervals android-timepicker


【解决方案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 来做到这一点。

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

  1. TimePickerDialog 是一个框架布局,请参见file。它只包含一个 TimePicker
  2. TimePicker 小部件只是一个线性布局,请参阅file。你可以看到分钟微调器是一个 NumberPicker
  3. 参考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 的设计。起初听起来可能令人生畏,但

      1. 这样您就可以根据需要自定义实现,包括初始化TimePicker 值以显示分钟(如here 所述),以及
      2. 其实应该不难,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_width="0dp"
                      android:layout_height="wrap_content"
                      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://stackoverflow.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 填充它,如上所示。
              猜你喜欢
              • 1970-01-01
              • 2018-02-16
              • 2020-12-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-07
              • 2020-10-07
              • 1970-01-01
              相关资源
              最近更新 更多