安卓(Android)实现选择时间功能

前言

由于大部分android初级教程都没教怎么选择时间,初学者碰到这种难免会有些不知所措,难道要让用户自己输入日期时间?先不说用户体验不好,处理用户输入各式各样的日期格式也要花好大一番功夫,下面看看如何实现android选择时间的功能。

android 6.0 中的运行效果

TimePickerDialog和DatePickerDialog介绍

系统封装好了两个类可以供我们直接调用,TimepickerDialog用于选择时间,DatePickerDialog用于选择日期。

TimePikckerDialog的构造方法

public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)

1、第一个参数接受一个context信息

2、第二个参数为当选择时间完成后执行的回调接口

3、第三个参数和第四个参数为初始化的时间

4、第四个参数选择true代表24小时制,false代表12小时制

DatePickerDialog构造方法

public DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)

1、第一个参数接受context信息

2、第二个参数为日期选择完成后的回掉接口

3、最后三个参数分别为初始化的年月日

可以看出两者的构造方法基本相差不多,由于两者都是继承自AlertDialog,所以得到两者对象后只要调用它们的show()方法即可将选择框弹出。

具体实现

有两种实现方式,一种是直接在Activity中使用,还有一种是通过FragmentDialog使用。

直接在Activity中使用比较简单,不过代码会比较乱,通过FragmentDialog管理的使用方式会比较优雅,而且便于管理。

直接在Activity中使用

布局文件,里面就一个TextView用于显示所选时间

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.testdemo.TestActivity">

  <TextView
    android:layout_centerInParent="true"
    android:textSize="20sp"
    android:id="@+id/time_text"
    android:text="点此选择时间"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

Activity文件:

public class TestActivity extends AppCompatActivity {

  private TextView timeText;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    timeText = (TextView) findViewById(R.id.time_text);
    //为TextView设置点击事件
    timeText.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //将timeText传入用于显示所选择的时间
        showDialogPick((TextView) v);
      }
    });
  }
  //将两个选择时间的dialog放在该函数中
  private void showDialogPick(final TextView timeText) {
    final StringBuffer time = new StringBuffer();
    //获取Calendar对象,用于获取当前时间
    final Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    //实例化TimePickerDialog对象
    final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() {
      //选择完时间后会调用该回调函数
      @Override
      public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        time.append(" " + hourOfDay + ":" + minute);
        //设置TextView显示最终选择的时间
        timeText.setText(time);
      }
    }, hour, minute, true);
    //实例化DatePickerDialog对象
    DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() {
      //选择完日期后会调用该回调函数
      @Override
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //因为monthOfYear会比实际月份少一月所以这边要加1
        time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth);
        //选择完日期后弹出选择时间对话框
        timePickerDialog.show();
      }
    }, year, month, day);
    //弹出选择日期对话框
    datePickerDialog.show();
  }

}

到此,点击运行就可以看效果了:)

通过FragmentDialog使用

为什么要用DialogFragment

1、用DialogFragment管理对话框是官方推介的使用方式。

2、使用DialogFragment管理对话框也方便代码的重用。

通过FragmentDialog实现步骤

DatePickerFragment类:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
  private String date;
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    //得到Calendar类实例,用于获取当前时间
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    //返回DatePickerDialog对象
    //因为实现了OnDateSetListener接口,所以第二个参数直接传入this
    return new DatePickerDialog(getActivity(), this, year, month, day);
  }

  //实现OnDateSetListener接口的onDateSet()方法
  @Override
  public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    //这样子写就将选择时间的fragment和选择日期的fragment完全绑定在一起
    //使用的时候只需直接调用DatePickerFragment的show()方法
    //即可选择完日期后选择时间
    TimePickerFragment timePicker = new TimePickerFragment();
    timePicker.show(getFragmentManager(), "time_picker");
    //将用户选择的日期传到TimePickerFragment
    date = year + "年" + (monthOfYear+1) + "月" + dayOfMonth + "日";
    timePicker.setTime(date);
  }
}

TimePickerFragment类:

//实现OnTimeSetListener接口
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener{
  private String time = "";
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    //新建日历类用于获取当前时间
    Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    //返回TimePickerDialog对象
    //因为实现了OnTimeSetListener接口,所以第二个参数直接传入this
    return new TimePickerDialog(getActivity(), this, hour, minute, true);
  }

  //实现OnTimeSetListener的onTimeSet方法
  @Override
  public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    //判断activity是否是DataCallBack的一个实例
    if(getActivity() instanceof DataCallBack){
      //将activity强转为DataCallBack
      DataCallBack dataCallBack = (DataCallBack) getActivity();
      time = time + hourOfDay + "点" + minute + "分";
      //调用activity的getData方法将数据传回activity显示
      dataCallBack.getData(time);
    }
  }

  public void setTime(String date){
    time += date;
  }

}

Activity的布局文件,只有一个TextView用于显示时间

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.testdemo.TestActivityActivity">

  <TextView
    android:id="@+id/time_text"
    android:layout_centerInParent="true"
    android:text="点此选择时间"
    android:textSize="20sp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

Activity文件:

//实现DataCallBack接口,实现与Fragment的通信
public class TestActivityActivity extends AppCompatActivity implements DataCallBack{

  TextView timeText;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test2);
    timeText = (TextView) findViewById(R.id.time_text);
    //为timeText设置点击事件
    timeText.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //实例化对象
        DatePickerFragment datePickerFragment = new DatePickerFragment();
        //调用show方法弹出对话框
        // 第一个参数为FragmentManager对象
        // 第二个为调用该方法的fragment的标签
        datePickerFragment.show(getFragmentManager(), "date_picker");
      }
    });
  }

  //实现DataCallBack的getData方法
  @Override
  public void getData(String data) {
    //data即为fragment调用该函数传回的日期时间
    timeText.setText(data);
  }
}

由于TimePickerFragment对话框是在DatePickerFragment类里面启动的,所以这样写只能日期和时间都选择,如果要单独选择日期或者时间,只需要重写onTimeSet()或者onDateSet()方法即可

兼容性问题

不同的android版本显示的效果不同,在android6.0效果很好,不过在一些低版本android(如4.0,笔者没有每个版本都测试)会出现调用两次回掉函数的情况,导致选择两次时间。解决的办法有很多,只要保证回调函数里面的逻辑只执行一次就可以。这里提供一种比较通用的方法。

重写TimePickerDialogDatePickerDialogonStop()方法

直接在Activity中使用的重写方法

final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() {
      //选择完时间后会调用该回调函数
      @Override
      public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        time.append(" " + hourOfDay + ":" + minute);
        //设置TextView显示最终选择的时间
        timeText.setText(time);
      }
    }, hour, minute, true){
     // 重写onStop()
      @Override
      protected void onStop() {

      }
    };
    //实例化DatePickerDialog对象
    DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() {
      //选择完日期后会调用该回调函数
      @Override
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //因为monthOfYear会比实际月份少一月所以这边要加1
        time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth);
        //选择完日期后弹出选择时间对话框
        timePickerDialog.show();
      }
    }, year, month, day){
      //重写onstop
      @Override
      protected void onStop() {
      }
    };

上面的写法看起来会比较乱,也可以另外新建一个类继承TimePickerDialog或者DatePickerDialog然后重写onStop()方法

通过FragmentDialog使用的重写方式

只需在onCreateDialog()方法里面重写即可,下面的代码会比较清晰

return new DatePickerDialog(getActivity(), this, year, month, day){
      // 重写onStop
      @Override
      protected void onStop() {
      }
    };
 return new TimePickerDialog(getActivity(), this, hour, minute, true){
      //重写onStop
      @Override
      protected void onStop() {
      }
    };

总结

笔者水平有限,但是保证以上代码都是亲手实现过一遍的。如果有什么不足之处欢迎大家指出,以上就是本文的全部内容,希望对大家开发Android能有所帮助。

(0)

相关推荐

  • Android调用系统时间格式显示时间信息

    使用如下方法: 复制代码 代码如下: java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context); dateFormat = android.text.format.DateFormat.getTimeFormat(context.getApplicationContext());

  • android 默认时间格式修改方法

    在android使用中,遇到修改默认时间格式时,总是束手无策,本文将以此问题提供解决方案,需要了解的朋友可以参考下 语言为英语时,默认的时间格式为mm/DD/yyyy,请问怎么将默认时间格式修改为:DD/mm/yyyy,不知道是在framework层给初始化的还是编译的时候给的初始值,哪位大侠知道怎么该? 1.修改文件alps\frameworks\base\packages\SettingsProvider\res\values\defaults.xml 增加代码<string name=&quo

  • android计时器,时间计算器的实现方法

    需求:默认为"00:00:00",点击开始按钮时清零后开始计时,出现如10:28:34.点击停止的时候停止计时.问题:使用Calendar DateFormat的方法,不设置时区获取到的小时是本地时区的(东八区的就是8),设置成GMT标准时区获取到的时间是12小时(12:00:00),设置24小时制无效.在开始时间加减各种小时都无效,而且计时只能到12小时就自动跳上去了,始终无法出现默认状态00:00:00开始计时的效果.尝试各种时间设置方法无效后只能自己写一个根据秒数转换时间格式字符

  • android获取时间差的方法

    本文实例讲述了android获取时间差的方法.分享给大家供大家参考.具体分析如下: 有些时候我们需要获取当前时间和某个时间之间的时间差,这时如何获取呢? 1. 引用如下命名空间: import java.util.Date; import android.text.format.DateFormat; 2. 设置时间格式: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 3. 获取时间: Date c

  • Android时间选择器、日期选择器实现代码

    本文为大家分享了两款选择器,一款可以针对时间进行选择.一款可以针对日期进行选择,供大家参考,具体内容如下 一.时间选择器 1.1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.and

  • 轻松实现可扩展自定义的Android滚轮时间选择控件

    项目需求中有个功能模块需要用到时间选择控件,但是android系统自带的太丑了,只能自己优化下,结合WheelView实现滚轮选择日期,好像网上也挺多这种文章的.但是适用范围还是不同,希望这个能够对需求相同的朋友有一定帮助.控件标题还有年月日时分秒这些可以自己控制是否显示,先来看效果. 1.有年月日时分的开始时间 2.只有年月日的结束时间 3.用于有时身份证到期的时间选择(分为勾选长期和直接选择时间两种,另外长期后面自己也可以进行扩展) 4.项目结构 5.直接贴代码,代码里面注释很详细 <spa

  • Android中TimePicker与DatePicker时间日期选择组件的使用实例

    效果和代码都非常直观: 实例1:TimePicker <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_par

  • Android之日期及时间选择对话框用法实例分析

    本文实例讲述了Android之日期及时间选择对话框用法.分享给大家供大家参考.具体如下: 清单文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ljq.dialog" android:versionCode=&q

  • 解析android中系统日期时间的获取

    复制代码 代码如下: import    java.text.SimpleDateFormat; SimpleDateFormat    formatter    =   new    SimpleDateFormat    ("yyyy年MM月dd日    HH:mm:ss     ");     Date    curDate    =   new    Date(System.currentTimeMillis());//获取当前时间     String    str    =

  • 安卓(Android)实现选择时间功能

    前言 由于大部分android初级教程都没教怎么选择时间,初学者碰到这种难免会有些不知所措,难道要让用户自己输入日期时间?先不说用户体验不好,处理用户输入各式各样的日期格式也要花好大一番功夫,下面看看如何实现android选择时间的功能. android 6.0 中的运行效果 TimePickerDialog和DatePickerDialog介绍 系统封装好了两个类可以供我们直接调用,TimepickerDialog用于选择时间,DatePickerDialog用于选择日期. TimePikck

  • Android实现记事本功能(26)

    本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.smartnotef.activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.

  • 安卓(Android)开发之统计App启动时间

    前言 作为 Android 开发者,想必多多少少要接触启动速度优化相关的事情,当用户越来越多,产品的功能也随着迭代越来越多,App 逐渐变得臃肿是一件很常见的现象,甚至可以说是不可避免的现象,随之而来的工作就是优化 App 性能,其中最主要的一项就是启动速度优化.但本文的主角并不是启动速度优化,而是启动时间统计. 一.启动类型 工欲善其事,必先利其器.想要优化 App 的启动速度,必须有准确衡量启动时间的方法,否则优化完之后效果怎样,自己都不知道,说出去别人也不信服不是.在做 App 启动时间统

  • Android实现登录功能demo示例

    本文实例讲述了Android实现登录功能的方法.分享给大家供大家参考,具体如下: 安卓,在小编实习之前的那段岁月里面,小编都没有玩儿过,如果说玩儿过,那就是安卓手机了,咳咳,敲登录的时候有种特别久违的熟悉,这种熟悉的感觉就和当时敲机房收费系统一样,那叫一个艰难啊,不过小编相信,在小编的IT成长之路上,正是因为有了这些艰难险阻陪伴着小编一起成长,才让小编更加勇敢坚强,勇敢的面对一个又一个bug,坚强的敲完一行行代码,经过了几天的研究登录一条线的功能已经实现,现在小编就来简单的总结一下,还请小伙伴们

  • 详解Android开启OTG功能/USB Host API功能

    目录 Android USB 模式简介设备模式 主机模式 配件模式 Android主机模式的开启 Android USB Host API功能的确认和开启 Android USB 模式简介设备模式 当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为“USB设备”角色的,在计算机上显示为 USB 外设.现在的安卓设备已经被赋予了愈加丰富的功能,如MTP相机模式.文件传输模式(类似于U盘).RNDIS网卡模式等.当使用普通手机数据线连接安卓手机和电脑就可以使用这些功能. 主机模式 And

  • Android 偷拍功能实现(手机关闭依然拍照)详解及实例代码

     Android 偷拍功能/手机关闭能拍照 效果如下: 其实偷拍与偷录实现方式是一样的,都是使用到的WindowManager来绘制桌面小控件的原理.那我就不多说了- 一.首先我们需要一个SurfaceView: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

  • Android登录注册功能 数据库SQLite验证

    本文实例为大家分享了Android登录注册功能的具体代码,供大家参考,具体内容如下 展示效果 代码区 MainActivity(登录方法) public class MainActivity extends AppCompatActivity { @BindView(R.id.editText) EditText editText; @BindView(R.id.editText2) EditText editText2; @BindView(R.id.button) Button button

  • Android实现搜索功能并本地保存搜索历史记录

    本文实例为大家分享了Android实现搜索功能,并且需要显示搜索的历史记录,供大家参考,具体内容如下 效果图: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点: - 数据库的增删改查操作 - ListView和ScrollView的嵌套冲突解决 - 监听软键盘回车按钮设置为搜索按钮 - 使用TextWatcher( )实时筛选 - 已搜索的关键字再次搜索不重复添加到数据库 - 刚进入页面设置软键盘不因为EditText而自动弹出 代码 RecordSQLiteOpenHel

  • 总结安卓(Android)中常用的跳转工具

    话不多说了,直接上代码,这篇文章包含了一些基本的并且常用的跳转工具,一起来看看吧. 首先,这是需要的对应的权限. <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="

  • Android ActionBar搜索功能用法详解

    本文实例讲述了Android ActionBar搜索功能用法.分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意点: 首先要吐槽一下Android的官方Guide文档 ,关于用法讲得不明确,可能是一直没更新的原因吧. 本来照着文档搞了一下,hint死活出不来,也无法跳转到搜索结果Activity. StackOverflow也有人提出了这个问题,答案说得很明白 - 参考链接. 正确用法 1. 在AndroidManifest.xml中为提供SearchView

随机推荐