Android日期/时间轮选择器

Android日期/时间轮选择器,android,datepicker,datetimepicker,timepicker,Android,Datepicker,Datetimepicker,Timepicker,如何为时间选择器(以及日期选择器)实现此布局?默认布局是(非常大的)时钟或(不漂亮的)微调器样式的时间选择器。我在几个应用程序中看到了这一点,但找不到如何实现这种外观和感觉 此示例有三个选择器:NumberPicker、DatePicker和TimerPicker 或 仅使用不带库的示例,并覆盖Android默认选择器。您应该注意,此对话框是一个片段 也就是说,主要思想是: 当您需要启动此日期选择器时,您将显示该片段作为当前活动的覆盖。此片段有一个日期选取侦听器:当用户选取日期时启动的事件。好

如何为时间选择器(以及日期选择器)实现此布局?默认布局是(非常大的)时钟或(不漂亮的)微调器样式的时间选择器。我在几个应用程序中看到了这一点,但找不到如何实现这种外观和感觉


此示例有三个选择器:NumberPicker、DatePicker和TimerPicker


仅使用不带库的示例,并覆盖Android默认选择器。

您应该注意,此对话框是一个片段

也就是说,主要思想是: 当您需要启动此日期选择器时,您将显示该片段作为当前活动的覆盖。此片段有一个日期选取侦听器:当用户选取日期时启动的事件。好的,在这里之前一切都很简单。最难理解的是最后一件事:片段和活动之间的交互。为何因为活动需要知道选择了哪个日期。为了实现这一点,片段将有一个公共接口,该接口将由活动实现

好的,让我们看看代码:

MyActivity.java

public class MyActivity extends FragmentActivity implements DatePickerFragment.FragmentInteraction{

    @Override
    public void onCreate(Bundle savedInstanceState){
        Button showDatePickerButton = (Button)findViewById(R.id.dateButton);
        showDatePickerButtonsetOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                DialogFragment newFragment = new DatePickerFragment();
                newFragment.show(getSupportFragmentManager(), getString(R.string.datePickerTitle));
            }
        });
    }

    @Override
    public void doSomethingWithDate(int day, int month, int year) {
        Log.d("", "SELECTED DATE " + month + "/" + day  + "/" + year);
    }
}
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

    private FragmentInteraction mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mListener = (FragmentInteraction) activity;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        //Show picker with actual date presetted
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int anio, int mes, int dia) {
        mListener.doSomethingWithDate(dia, mes + 1, anio);
    }

    public interface FragmentInteraction{
        public void doSomethingWithDate(int dia, int mes, int anio);
    }
}
DatePickerFragment.java

public class MyActivity extends FragmentActivity implements DatePickerFragment.FragmentInteraction{

    @Override
    public void onCreate(Bundle savedInstanceState){
        Button showDatePickerButton = (Button)findViewById(R.id.dateButton);
        showDatePickerButtonsetOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                DialogFragment newFragment = new DatePickerFragment();
                newFragment.show(getSupportFragmentManager(), getString(R.string.datePickerTitle));
            }
        });
    }

    @Override
    public void doSomethingWithDate(int day, int month, int year) {
        Log.d("", "SELECTED DATE " + month + "/" + day  + "/" + year);
    }
}
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

    private FragmentInteraction mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mListener = (FragmentInteraction) activity;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        //Show picker with actual date presetted
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int anio, int mes, int dia) {
        mListener.doSomethingWithDate(dia, mes + 1, anio);
    }

    public interface FragmentInteraction{
        public void doSomethingWithDate(int dia, int mes, int anio);
    }
}

对于可能需要此功能的任何人的未来参考,只需在android小部件中选择一个时间选择器,然后在xml文件中键入
android:timePickerMode=“spinner”
即可实现此时间选择器微调器

您的小部件xml代码应该如下所示:

<TimePicker
    android:id="@+id/timePicker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:timePickerMode="spinner" />


我的答案是基于。

简单地添加xml格式的timepickermode,如下所示

在我看来,实现这一点的最简单方法是api级别21:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="8dp">

    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:timePickerMode="spinner" />

    <DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:calendarViewShown="false"
        android:datePickerMode="spinner" />

</LinearLayout>

你得到这个:


你可以在android中查看时间选择器,这里有一些链接,只需查看即可显示我想要的时间选择器布局,但它似乎是默认的时间选择器,尽管我在预览中没有看到它(使用最新的api 22)。我认为它是一个带有上下按钮的旋转器。谢谢。你所说的“只使用样本而不使用库并覆盖Android默认选择器”是什么意思?你的好消息。在这个示例中,有一个示例使用了一个库,该库覆盖了Android默认选择器,您可以更改颜色,但如果您只想使用具有默认颜色的选择器,请仅查看app文件夹中的示例,并将“net.simonvt.timepicker.timepicker”覆盖为“timepicker”。据我所知,我需要net.simonvt.datepicker.datepicker(例如)实现,以便查看我想要的外观,在哪里可以找到它以便在代码中使用它?在链接中,我只看到了对它的引用,但没有看到实际的实现,我遗漏了什么?它们在示例中“app”文件夹旁边,有文件夹“numberpicker library”、“datepicker libray”和“timerpicker library”.所以我需要从这里获取来源:然后我就可以在我的应用程序的布局中使用它们了?我不确定我是否理解你的回答。我希望将时间/日期选择器组件与其他组件一起放置在片段上,用户可以在其中选择日期/时间。我的问题是关于时间选择器组件的布局。只需使用DatePickerFragment类并跳过接口,它就不能与其他对象/组件/视图一起用作布局中的简单对象/组件/视图?例如:同一版面内的日期选择器、文本视图和按钮?当然可以。但它不是一个简单的组件。这是一个片段组件