TimePicker Минутные интервалы

Я создал представление с выбором даты и временем в формате счетчика. Кажется, все работает хорошо, за исключением того, что я не могу понять, как установить минуты с 5-минутными интервалами?

Я видел примеры того, как это сделать с помощью DialogFragment, и использовал DialogFragments для запуска отдельных действий с помощью Date Picker или Time Picker, но я пытаюсь создать действие с обоими.

Мне нужно либо изменить мой текущий код, чтобы изменить минутный интервал, либо включить DialogFragment в мой код, который работает с Time Picker, встроенным в мое представление.

Я не могу найти ни одного примера, как это сделать. Мы ценим любые предложения.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DatePicker simpleDatePicker = (DatePicker)findViewById(R.id.date_picker); // initiate a date picker

        //Above API 26
        // ????
        simpleDatePicker.setOnDateChangedListener(new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                // Do something
            }
        });

        TimePicker simpleTimePicker = (TimePicker)findViewById(R.id.time_picker); // initiate a time picker

        simpleTimePicker.setIs24HourView(true);// set to 24 hour

        simpleTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                // Do somthing
            }
        });
    }

    public void cancelBTN(View view) {
    }

    public void saveBTN(View view) {
    }
}


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <Button
            android:id="@+id/cancelBTN"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:background="@color/gray"
            android:onClick="cancelBTN"
            android:text="Cancel"
            android:textColor="@color/white" />

        <TextView
            android:id="@+id/Title"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:background="@color/gray"
            android:gravity="center"
            android:text="Select Date - Time"
            android:textColor="@color/white"
            android:textSize="20dp" />

        <Button
            android:id="@+id/saveBTN"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:layout_alignParentRight="true"
            android:background="@color/gray"
            android:onClick="saveBTN"
            android:text="Save"
            android:textColor="@color/white" />

        <DatePicker
            android:calendarViewShown="false"
            android:datePickerMode="spinner"
            android:id="@+id/date_picker"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_below="@+id/saveBTN"
            />

        <TimePicker
            android:timePickerMode="spinner"
            android:id="@+id/time_picker"
            android:layout_marginTop="15dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="25dp"
            android:layout_marginRight="25dp"
            android:layout_below="@+id/date_picker"

            />


    </RelativeLayout>


</RelativeLayout>

person Simon    schedule 20.02.2019    source источник


Ответы (2)


Я нашел способ обойтись без DialogFragment. Я добавил новую функцию и вызвал ее после инициализации TimePicker. См. Ниже код для подробностей.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DatePicker simpleDatePicker = (DatePicker)findViewById(R.id.date_picker); // initiate a date picker

        //Above API 26
        // ????
        simpleDatePicker.setOnDateChangedListener(new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                // Do something
            }
        });

        TimePicker simpleTimePicker = (TimePicker)findViewById(R.id.time_picker); // initiate a time picker

        simpleTimePicker.setIs24HourView(true);// set to 24 hour

        setTimePickerInterval(simpleTimePicker);

        simpleTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                // Do somthing
            }
        });
    }

    private void setTimePickerInterval(TimePicker timePicker) {
        try {
            int TIME_PICKER_INTERVAL = 5;
            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) {

        }
    }

    public void cancelBTN(View view) {
    }

    public void saveBTN(View view) {
    }
}
person Simon    schedule 20.02.2019

Используйте CustomTimePickerDialog вместо TimePickerDialog. Думаю, твоя проблема решится.

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();
        }
    }
}
person Rezaul Karim    schedule 20.02.2019
comment
Думаю, это решит мою проблему. К сожалению, я не могу понять, как запустить TimePicker с помощью CustomTimePickerDialog в моем основном действии? - person Simon; 20.02.2019
comment
Если вы нацеливаете api 30 на устройство под управлением Android 11, следующий код выдает исключение classForid.getField (minute). Вы можете избежать этого, используя вместо (NumberPicker) timePicker.findViewById (Resources.getSystem (). GetIdentifier (minute, id, android)), как это сделал @Simon в своем коде. - person Stéphane Padovani; 15.12.2020