安卓日期/时间滚轮选择器

9
我该如何实现这种时间选择器的布局(以及日期选择器)?默认布局是一个(非常大的)时钟或者(不美观的)旋转选择器风格的时间选择器。我在几个应用程序中看到了这个,但找不到如何实现这种外观和感觉的方法。

你可以在这里查看Android中的时间选择器,以下是一些链接,请查阅: http://www.tutorialspoint.com/android/android_timepicker_control.htm http://www.mkyong.com/android/android-time-picker-example/
http://androidexample.com/Time_Picker_With_AM_PM_Values_-_Android_Example/index.php?view=article_discription&aid=86&aaid=109
- Hanuman
http://www.tutorialspoint.com/android/android_timepicker_control.htm 展示了我想要的时间选择器布局,但它似乎是默认的时间选择器,尽管在我的预览中(使用最新的API 22)我并没有看到它是这样的。我看到的是一个带有上下按钮的旋转选择器。 - Amos
5个回答

8

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

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

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

我的回答基于文档

6

我认为最简单的方法是使用21级API:

<?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>

你会得到这个:

日期时间选择器示例


1
这个例子有三个选择器:NumberPicker(数字选择器),DatePicker(日期选择器)和TimerPicker(计时器选择器)。

https://github.com/rodrigobusata/android-pickers

或者

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


据我所知,为了看到我想要的外观和感觉,我需要net.simonvt.datepicker.DatePicker(例如)实现,我在哪里可以找到它以便在我的代码中使用?在链接中,我只看到对它的引用,但没有实际实现,我错过了什么? - Amos
它们位于“app”文件夹旁边的示例中,有“numberpicker-library”、“datepicker-library”和“timerpicker-library”文件夹。 - Busata
所以我需要从这里获取源代码:https://github.com/rodrigobusata/android-pickers/tree/master/timerpicker-library/src/main/java/net/simonvt/timepicker,然后我就可以在我的应用程序布局中使用它们了? - Amos
奇怪的是,显然那个丑陋的旋转器只出现在预览中,当我实际运行应用程序时,它看起来就像我想要的那样。 - Amos
1
我认为链接已失效。 - Faisal Naseer
显示剩余4条评论

0

你应该注意到这个对话框是一个片段。

也就是说,主要思想是这样的: 当你需要启动这个日期选择器时,你会将该片段显示为当前活动的覆盖层。这个片段有一个日期选择监听器:当用户选择日期时,会触发一个事件。好了,直到这里一切都很容易理解。最难理解的是最后一个问题:片段和活动之间的交互。为什么?因为活动需要知道选择了哪个日期。为了实现这一点,片段将拥有一个公共接口,由活动来实现。

好的,让我们看看代码:

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);
    }
}

DatePickerFragment.java

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);
    }
}

不确定我理解你的回复。我想在一个片段上放置一个时间/日期选择器组件,用户可以在其中选择日期/时间,并且还有其他组件。我的问题是关于时间选择器组件的布局。 - Amos
只需使用DatePickerFragment类,跳过接口。 - Joaquin Iurchuk
那么它不能作为一个简单的对象/组件/视图与其他对象/组件/视图一起在布局中使用?例如:日期选择器、文本视图和按钮放置在同一个布局中? - Amos
是的,当然可以。但它不是一个简单的组件,而是一个片段组件。 - Joaquin Iurchuk

0
只需像这样在xml中添加timepickermode <TimePicker android:id="@+id/time" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:gravity="center" android:timePickerMode="spinner" android:text="时间选择器" android:textSize="18sp" android:textColor="@android:color/black" android:textStyle="bold"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接