【问题标题】:Android date/time wheel pickerAndroid 日期/时间轮选择器
【发布时间】:2015-04-06 11:58:24
【问题描述】:

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

【问题讨论】:

标签: android datepicker datetimepicker timepicker


【解决方案1】:

为了将来可能需要此功能的任何人参考,只需在 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" />

我的回答是基于documentation

【讨论】:

    【解决方案2】:

    在我看来,实现这一目标的最简单方法是从 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>
    

    你明白了:

    【讨论】:

      【解决方案3】:

      这个例子有三个选择器:NumberPicker、DatePicker 和 TimerPicker。

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

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

      【讨论】:

      • 谢谢。 “仅使用没有库的示例并覆盖 Android 默认选择器”是什么意思?
      • 欢迎您。在此示例中,有一个示例使用了一个覆盖 Android 默认选择器的库,以便可以更改颜色,但如果您只想使用具有默认颜色的选择器,请仅查看 app 文件夹内的示例并覆盖“net.simonvt. timepicker.TimePicker" 到 "TimePicker"。
      • 据我了解,我需要 net.simonvt.datepicker.DatePicker (例如)实现才能看到我想要的外观,我在哪里可以找到它以便使用它在我的代码中?在链接中,我只看到对它的引用,但没有看到实际的实现,我错过了什么?
      • 它们在“app”文件夹旁边的示例中,有“numberpicker-library”、“datepicker-libray”和“timerpicker-library”文件夹。
      • 所以我需要从这里获取资源:github.com/rodrigobusata/android-pickers/tree/master/…,然后我就可以在我的应用程序内的布局中使用它们?
      【解决方案4】:

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

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

      好,我们看代码:

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

      【讨论】:

      • 不确定我是否理解您的回复。我希望将时间/日期选择器组件与用户可以选择日期/时间的其他组件一起放置在片段上。我的问题是关于时间选择器组件的布局。
      • 只使用DatePickerFragment类,跳过界面
      • 所以它不能与其他对象/组件/视图一起用作布局中的简单对象/组件/视图吗?例如:同一布局内的日期选择器、文本视图和按钮?
      • 是的,当然。但不是一个简单的组件。这是一个片段组件
      【解决方案5】:

      像这样在 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="TimePicker" android:textSize="18sp" android:textColor="@android:color/black" android:textStyle="bold"/>

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        相关资源
        最近更新 更多