Средство выбора времени и даты в одном и том же DialogFragment

Я осмотрелся, но я просто не могу найти хороший способ сделать выбор времени и даты, как на картинке ниже. Я предполагаю, что выбор времени - это всего два NumberPicker, но я не знаю, где найти левый с [день, дата, месяц].

NumberPicker со строками является опцией, однако создает эти строки с датами. Есть ли способ проще/лучше?

Что я ищу


person Jakkra    schedule 04.02.2015    source источник


Ответы (2)


Красивый выбор даты и времени для вас:

Если вы хотите настроить выбор даты и времени:

Здесь я могу вам помочь: вы можете создать макет, состоящий из DatePicker и TimePicker в LinearLayout с вертикальной ориентацией.

custom_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

    <DatePicker
         android:id="@+id/datePicker1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" >
    </DatePicker>

    <TimePicker
        android:id="@+id/timePicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </TimePicker>

</LinearLayout>

Затем используйте этот макет для создания своего диалога.

Dialog dialog = new Dialog(mContext);

dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("Custom Dialog");

Чтобы отреагировать на взаимодействие пользователя с вашим TimePicker, сделайте что-то вроде этого:

TimePicker tp = (TimePicker)dialog.findViewById(R.id.timepicker1);
tp.setOnTimeChangedListener(myOnTimechangedListener);

Чтобы получить значения из Date- и TimePicker, когда пользователь закончит их настройку, добавьте кнопку OK в диалоговое окно, а затем прочитайте значения даты и времени из Date- и TimePicker, когда пользователь нажмет OK.

person GIGAMOLE    schedule 04.02.2015
comment
Спасибо. Да, это здорово, но мой план состоял в том, чтобы расположить их бок о бок. Не хочу усложнять. - person Jakkra; 04.02.2015

Я решил это «трудным путем» с 3 номерными пикерами. Если у кого-то такая же проблема, вот мое решение. Дизайн не окончательный, но он близок к тому, что я хотел.

введите здесь описание изображения

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        dates = getDatesFromCalender();

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialogfragment_time_date_picker, container);
        datePicker = (NumberPicker) view.findViewById(R.id.datePicker);
        hourPicker = (NumberPicker) view.findViewById(R.id.hourPicker);
        minutePicker = (NumberPicker) view.findViewById(R.id.minutePicker);
        doneButton = (Button) view.findViewById(R.id.doneButton);
        currentTimeButton = (Button) view.findViewById(R.id.currentTimeButton);
        datePicker.setMinValue(0);
        datePicker.setMaxValue(dates.length - 1);
        datePicker.setFormatter(new NumberPicker.Formatter() {

            @Override
            public String format(int value) {
                return dates[value];
            }
        });

        datePicker.setDisplayedValues(dates);
        hourPicker.setMinValue(0);
        hourPicker.setMaxValue(23);
        hourPicker.setValue(rightNow.get(Calendar.HOUR_OF_DAY));
        minutePicker.setMinValue(0);
        minutePicker.setMaxValue(59);
        minutePicker.setValue(rightNow.get(Calendar.MINUTE));
        doneButton.setOnClickListener(this);
        currentTimeButton.setOnClickListener(this);
        getDialog().setTitle(R.string.choose_time);
        return view;
    }

    private String[] getDatesFromCalender() {
        Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
        Calendar c2 = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));

        List<String> dates = new ArrayList<String>();
        DateFormat dateFormat = new SimpleDateFormat("EE, dd MMM", new Locale("sv", "SE"));
        dates.add(dateFormat.format(c1.getTime()));

        for (int i = 0; i < 60; i++) {
            c1.add(Calendar.DATE, 1);
            dates.add(dateFormat.format(c1.getTime()));
        }
        c2.add(Calendar.DATE, -60);

        for (int i = 0; i < 60; i++) {
            c2.add(Calendar.DATE, 1);
            dates.add(dateFormat.format(c2.getTime()));
        }
        return dates.toArray(new String[dates.size() - 1]);
    }

    @Override
    public void onClick(View v) {
        Bundle args = new Bundle();
        if (v.getId() == R.id.doneButton) {
            //Handle selected time and date
        } else if (v.getId() == R.id.currentTimeButton) {

        }


    }

И XML

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="match_parent"


        >
    <LinearLayout android:layout_weight="0.3" android:layout_height="fill_parent"
                  android:layout_width="match_parent"
                  android:orientation="vertical">
        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
            <NumberPicker
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:id="@+id/datePicker"/>
            <NumberPicker
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:id="@+id/hourPicker"/>
            <NumberPicker
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:id="@+id/minutePicker"/>
        </LinearLayout>
    </LinearLayout>
    <LinearLayout android:layout_weight="1" android:layout_height="fill_parent" android:layout_width="match_parent"
                  android:orientation="horizontal">

        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/currentTime"
                android:id="@+id/currentTimeButton"/>
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/done"
                android:id="@+id/doneButton"/>
    </LinearLayout>
</LinearLayout>

person Jakkra    schedule 04.02.2015