【问题标题】:How can I set a minute interval in DialogFragment如何在 DialogFragment 中设置一分钟间隔
【发布时间】:2015-02-05 13:32:41
【问题描述】:

我正在尝试在androidDialogFragment中设置10分钟的间隔(由google建议),但我真的找不到办法。

这是显示对话框的片段类:

public class TimePickerFragment extends DialogFragment
        implements TimePickerDialog.OnTimeSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        String realMinute= "";

        switch (minute) {
            case 1:
                realMinute = "01";
                break;
            case 2:
                realMinute = "02";
                break;
            case 3:
                realMinute = "03";
                break;
            case 4:
                realMinute = "04";
                break;
            case 5:
                realMinute = "05";
                break;
            case 6:
                realMinute = "06";
                break;
            case 7:
                realMinute = "07";
                break;
            case 8:
                realMinute = "08";
                break;
            case 9:
                realMinute = "09";
                break;
            default:
                realMinute = String.valueOf(minute);
                break;
        }

        final String selectedDate = String.valueOf(hourOfDay) + ":" + realMinute;
        EditText selectedTimeTxt = (EditText) getActivity().findViewById(R.id.selectedTime);
        selectedTimeTxt.setText(selectedDate);
    }

一切都按预期工作,但我需要的是允许用户只选择 10 分钟的间隔 - 例如 1:10、1:20、1:30、1:40 等...

是否可以对其进行修改或扩展以满足我的需求?我知道我在这里遗漏了一个基本点,但作为一个新手,我无法发现它。

编辑

我的观点是:

【问题讨论】:

  • 快速谷歌搜索让我得到这个答案:stackoverflow.com/questions/7713538/…
  • @cYrixmorten 我已经尝试过了,但它不起作用。它只是将分钟乘以间隔值。选择器上也没有视觉变化。 :(
  • 如何使用 TimePicker 视图(例如 stackoverflow.com/questions/2580216/…)创建您自己的自定义 timepickerdialog? TimePicker 允许您设置它具有哪些值,因此您可以将 ["10", "20", "30",..] 作为分钟选项

标签: java android android-fragments android-dialogfragment dialogfragment


【解决方案1】:

您可以通过调用setDisplayedValues 为第二个号码选择器(分钟号码选择器)设置自己的值。但是,您首先需要找到 NumberPicker 视图。

Android Device Monitor,具有捕获设备屏幕和单独视图的好功能,因此您可以找到所需视图的 ID(或路径):

由于您的新值数组包含 6 个值 (0...5),因此您需要将当前分钟转换为 ,以免超出范围。

这是一个完整的例子:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);
    // Convert current minutes to tens
    // 55 = 50, 56 = 00
    int minute = c.get(Calendar.MINUTE) / 10;
    minute = (minute > 5) ? 0 : minute;

    // Create a new instance of TimePickerDialog and return it
    final TimePickerDialog tpd = new TimePickerDialog(getActivity(), this, hour, minute,
            DateFormat.is24HourFormat(getActivity()));

    tpd.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            int tpLayoutId = getResources().getIdentifier("timePickerLayout", "id", "android");

            ViewGroup tpLayout = (ViewGroup) tpd.findViewById(tpLayoutId);
            ViewGroup layout = (ViewGroup) tpLayout.getChildAt(0);

            // Customize minute NumberPicker
            NumberPicker minutePicker = (NumberPicker) layout.getChildAt(2);
            minutePicker.setDisplayedValues(new String[]{"00", "10", "20", "30", "40", "50"});
            minutePicker.setMinValue(0);
            minutePicker.setMaxValue(5);
        }
    });

    return tpd;
}

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    minute = minute * 10;
    Toast.makeText(getActivity(), "Selected minute: " + minute, Toast.LENGTH_LONG).show();
}

编辑:

当使用 AppCompat 主题时,对话框会显示一个圆形滑块,这是不可自定义的。但是,您可以告诉对话框使用更新的主题(这不会有问题,因为您的 minSdk 是 15):

final TimePickerDialog tpd = new TimePickerDialog(getActivity(),
        android.R.style.Theme_Holo_Light_Dialog, this, hour, minute,
        DateFormat.is24HourFormat(getActivity()));

【讨论】:

  • Attempt to invoke virtual method 'android.view.View android.view.ViewGroup.getChildAt(int)' on a null object reference ViewGroup layout = (ViewGroup) tpLayout.getChildAt(0); 有一个错误:(
  • @Slim 您是否使用与我的答案完全相同的代码?您的错误可能意味着布局尚未膨胀,或者与我的 TimePickerDialog 的布局不同。使用我发布的方法(使用 Android Device Monitor)确认它是哪一个。
  • @Slim 看起来您正在使用提供不同 TimePickerDialog 的 AppCompat 主题。您使用的是什么 API?
  • minSdkVersion: 15, targetSdkVersion: 21, compileSdkVersion: 21 在棒棒糖模拟器上
  • @Slim 那么你就不需要使用 AppCompat 主题了。在您的 styles.xml 中更改为 <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 或等效项。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2011-12-04
  • 2018-02-16
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多