Как правильно определить TimePicker

205
13 апреля 2018, 18:07

У меня есть класс DatePickerFragment и с ним связанная кнопка. В итоге у меня появляется окошко с выбором даты. Я хочу сделать такое же окошко, только с выбором времени TimePickerFragment. Т.к. классы похожи, их нужно немного изменить, но у меня что-то пошло не так. В конце я выделил проблемный участок комментариями. Что нужно изменить?

public class DatePickerFragment extends DialogFragment {
public static  final String EXTRA_DATE =
        "com.diplom.android.diplom.taskIntent.date";
private static final String ARG_DATE = "date";
private DatePicker mDatePicker;
//Передача даты через аргументы = объект дэйт аргумент фрагмента
public static DatePickerFragment newInstance(Date date) {
    Bundle args = new Bundle();
    args.putSerializable(ARG_DATE, date);
    DatePickerFragment fragment = new DatePickerFragment();
    fragment.setArguments(args);
    return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
    Date date = (Date) getArguments().getSerializable(ARG_DATE);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int year = calendar.get(Calendar.YEAR);
    int mouth = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    View v = LayoutInflater.from(getActivity())
            .inflate(R.layout.dialog_date, null);
    mDatePicker = (DatePicker) v.findViewById(R.id.dialog_date_picker);
    mDatePicker.init(year, mouth, day, null);

    return new AlertDialog.Builder(getActivity())
            .setView(v)
            .setTitle(R.string.date_picker_title)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    int year = mDatePicker.getYear();
                    int month = mDatePicker.getMonth();
                    int day = mDatePicker.getDayOfMonth();
                    Date date = new GregorianCalendar(year, month, day).getTime();
                    sendResult(Activity.RESULT_OK, date);
                }
            })
            .create();
}
private void sendResult(int resultCode, Date date){
    if (getTargetFragment() == null) {
        return;
    }
    Intent intent = new Intent();
    intent.putExtra(EXTRA_DATE, date);
    getTargetFragment()
            .onActivityResult(getTargetRequestCode(), resultCode, intent);
}

}

И кнопка, с которой он связан

    mDateButton = (Button) v.findViewById(R.id.task_date_title);
            updateDate();
            mDateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    FragmentManager manager = getFragmentManager();
                    DatePickerFragment dialog = DatePickerFragment.newInstance(mTask.getDate());
                    dialog.setTargetFragment(TaskFragment.this, Request_DATE);
                    dialog.show(manager, DIALOG_DATE);
                }
            });

Мне нужно сделать TimePickerFragment. Вот, что у меня вышло.

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState){
        Date date = (Date) getArguments().getSerializable(ARG_TIME);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //calendar.setTime(date);
//        mTimePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
//        mTimePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
       int hours = calendar.get(Calendar.HOUR);
       int minutes = calendar.get(Calendar.MINUTE);
        View v = LayoutInflater.from(getActivity())
                .inflate(R.layout.dialog_time, null);
        mTimePicker = (TimePicker) v.findViewById(R.id.dialog_time_picker);
        mTimePicker.setIs24HourView(true);
        mTimePicker.setCurrentHour(new Integer(minutes));
        mTimePicker.setCurrentHour(new Integer(hours));
       // mTimePicker.init(year, mouth, day, null);

        return new AlertDialog.Builder(getActivity())
                .setView(v)
                .setTitle(R.string.time_picker_title)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    ....//Вот здесь я не знаю, что сделать, чтобы
                  ......//вернуть нужный мне объект со временем
                    int hours = mTimePicker.getHour();
                    int minuts = mTimePicker.getMinute();
                    Date time = ;
                        sendResult(Activity.RESULT_OK, time);

                    }
                })
                .create();
    }
    private void sendResult(int resultCode, Date time){
        if (getTargetFragment() == null) {
            return;
        }
        Intent intent = new Intent();
        intent.putExtra(EXTRA_TIME, time);
        getTargetFragment()
                .onActivityResult(getTargetRequestCode(), resultCode, intent);
    }
Answer 1

Берем минуты и часы, переводим в миллисекунды.

Код:

//Перевели в миллисекунды:
long minutes = TimeUnit.MINUTES.toMillis(minutes);
long hours = TimeUnit.HOURS.toMillis(hours);
// Создали дату
Date newDate = Date(hours + minutes);

спасибо @pavlofff(у)

Answer 2

Это из харди. Сорян за спойлер, но я сделал так:

return new AlertDialog.Builder(getActivity())
            .setView(v)
            .setTitle(R.string.time_picker_title)
            .setPositiveButton(android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            date.setHours(mTimePicker.getCurrentHour());
                            date.setMinutes(mTimePicker.getCurrentMinute());
                            date.setSeconds(0);
                            sendResult(Activity.RESULT_OK, date);
                        }
                    })
            .create();
Answer 3

В примере выше используются устаревшие методы setHours(), setMinuts(), я их переработал примерно так:

    return new AlertDialog.Builder(getActivity())
                .setView(v)
                .setTitle(R.string.time_picker_title)
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                clock.set(Calendar.HOUR,mTimePicker.getCurrentHour()); //это экземпляр Calendar
                                clock.set(Calendar.MINUTE,mTimePicker.getCurrentMinute()); //это экземпляр Calendar
date.setMinutes(mTimePicker.getCurrentMinute());
                                date.setTime(clock.getTimeInMillis());
                                sendResult(Activity.RESULT_OK, date);
                            }
                        })
                .create();

здесь все еще содержатся устаревшие методы (getCurrentHour(), getCurrentMinute()), но это легко исправить, стерев слово Current в вызове метода, мне же компилятор не дает это сделать, так как я писал под API от 19, а эти методы поддерживаются API не ниже 23, а проверку условия установленной версии андрюши мне лень было писать. Всем ромашек ))

READ ALSO
как конвертировать int в 16 ричную систему?

как конвертировать int в 16 ричную систему?

Добрый день нужно на сервер отправлять данные ф формате 16 речной системы ASCIIК примеру -1 как FFFFFFFF соответсвенно -2 как FFFFFFFE

156
Правильная работа с ObserverList

Правильная работа с ObserverList

Всем приветВопрос про БД и JavaFX

180
Кракозябры в netty

Кракозябры в netty

Я только вникаю в netty, могу допустить серьёзные ошибки, не бейте тапками

142