最近在做一个项目,要求选择时间的控件是同时选择日期和小时和分钟,但是android中系统只有单独的日期DatePicker和TimePicker,所以就要自己写来组合一下。
首先是布局文件:
<?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:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <DatePicker android:id="@+id/DatePicker" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TimePicker android:id="@+id/TimePicker" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
布局文件很简单,把焦点设给父亲布局是为了不要一点开这个控件就弹出键盘。
代码如下:
package cn.com.egova.mobileinspector.community.view; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import cn.com.egova.mobileinspector.R; import cn.com.egova.mobileinspector.constance.Format; import android.app.Activity; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.TimePickerDialog; import android.app.TimePickerDialog.OnTimeSetListener; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.DatePicker.OnDateChangedListener; import android.widget.LinearLayout; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; import android.widget.Toast; public class DateTimeButton extends Button { public Calendar time = Calendar.getInstance(Locale.CHINA); public static final SimpleDateFormat format = new SimpleDateFormat(Format.DATA_FORMAT_YMDHMS_EN.toString()); private DatePicker datePicker; private TimePicker timePicker; private Button dataView; private AlertDialog dialog; // private Activity activity; public DateTimeButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DateTimeButton(Context context) { super(context); init(); } //增加构造器 public DateTimeButton(Context context,Button dataView){ super(context); this.dataView = dataView; } public AlertDialog dateTimePickerDialog(){ LinearLayout dateTimeLayout = (LinearLayout)LayoutInflater.from(getContext()).inflate(R.layout.date_time_picker, null); datePicker = (DatePicker) dateTimeLayout.findViewById(R.id.DatePicker); timePicker = (TimePicker) dateTimeLayout.findViewById(R.id.TimePicker); if(dataView == null) init(); timePicker.setIs24HourView(true); OnTimeChangedListener timeListener= new OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub time.set(Calendar.HOUR_OF_DAY, hourOfDay); time.set(Calendar.MINUTE, minute); } }; timePicker.setOnTimeChangedListener(timeListener); OnDateChangedListener dateListener = new OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // TODO Auto-generated method stub time.set(Calendar.YEAR, year); time.set(Calendar.MONTH, monthOfYear); time.set(Calendar.DAY_OF_MONTH, dayOfMonth); } }; datePicker.init(time.get(Calendar.YEAR), time.get(Calendar.MONTH), time.get(Calendar.DAY_OF_MONTH), dateListener); timePicker.setCurrentHour(time.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(time.get(Calendar.MINUTE)); dialog = new AlertDialog.Builder(getContext()).setTitle("设置日期时间").setView(dateTimeLayout) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub time.set(Calendar.YEAR, datePicker.getYear()); time.set(Calendar.MONTH, datePicker.getMonth()); time.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); time.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour()); time.set(Calendar.MINUTE, timePicker.getCurrentMinute()); updateLabel(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).show(); return dialog; } /** * */ private void init() { this.setBackgroundResource(R.drawable.datebutton_bg); this.setGravity(Gravity.LEFT); this.setTextColor(Color.BLACK); this.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 生成一个DatePickerDialog对象,并显示。显示的DatePickerDialog控件可以选择年月日,并设置 dateTimePickerDialog(); } }); updateLabel(); } /** * 更新标签 */ public void updateLabel() { if(dataView != null){ dataView.setText(format.format(time.getTime())); } this.setText(format.format(time.getTime())); } /** * @return 获得时间字符串"yyyy-MM-dd HH:mm:ss" */ public String getDateString() { return format.format(time.getTime()); } public void setDate(String datestr){ try { time.setTime(format.parse(datestr)); updateLabel(); } catch (ParseException e) { e.printStackTrace(); } } }
按理说这样就行了,我之前以为也是这样,因为为测试了,是OK的,但是只要你点击控件上的加减来修改日期或者时间,点击确定那么是可以修改和保存成功的,可是大家都知道,日期控件和时间控件里面的输入框是可以手动输入的,这样我才发现如果我手输,点击确定,时间没有进行修改,这可难住我了。
还好,我经过点击发现,在一个输入框中修改了数字之后直接点击确定,那么是没有响应timechangelisterner的或者datechangelisterner,都没有响应,但是输入之后,移到另外一个输入框,这个时候就响应了,同时时间也被修改了,所以我想到了,在输入完成后,点击确定的时候,将DatePicker和TimePicker的焦点清除不就行了。于是,请在代码的103行加入这两句:
datePicker.clearFocus(); timePicker.clearFocus();
这样就搞定了,经过测试,没问题。
相关推荐
本文将深入探讨“android日期和时间选择器”这一主题,包括其基本使用、自定义实现以及相关API的详细解析。 ### 1. Android原生日期和时间选择器 Android系统提供了两种内置的日期和时间选择器:`DatePicker`和`...
在Android SDK中,内置了DatePicker和TimePicker两种原生控件,但有时候,开发者可能需要更加强大、定制化的日期时间选择解决方案。本文将深入探讨Android的日期时间选择控件,并特别关注名为“DateSlider”的第三方...
在Android开发中,系统默认的日期和时间选择器虽然实用,但往往无法满足所有场景的需求。因此,开发者经常需要自定义日期选择器来提供更符合应用风格或特定功能的交互体验。这篇内容将深入探讨如何在Android中创建一...
在Android开发中,日期区间选择控件是一种常用的用户界面组件,尤其在预订系统、日程管理等场景下不可或缺。本文将深入探讨如何实现一个能够选取年月区间的自定义控件,以及涉及到的相关技术点。 首先,我们需要...
除了单独使用`DatePicker`和`TimePicker`,Android还提供了一个`DateTimePicker`的组合控件,它在一个对话框中同时显示日期和时间选择器。然而,这个控件并不是Android SDK的一部分,而是第三方库提供的。一个常用的...
"带有开始时间和结束时间的日期选择器"是一个DEMO项目,它专为Android Studio设计,允许用户同时选择一个起始日期和结束日期。这种组件在日程安排、预订系统或任何需要设定时间范围的应用中非常有用。 该DEMO的特点...
在Android开发中,为了提供用户友好的交互体验,开发者经常需要自定义各种控件,其中滚轮式日期和时间选择控件是一种常见的需求。这种控件通常用于设置事件的日期和时间,比如日历应用、闹钟设定等场景。本文将深入...
在Android应用开发中,日期和时间选择器是用户界面中常见的元素,用于让用户方便地选取特定的日期和时间。在Android SDK中,提供了多种方式来实现这种功能,包括使用原生的DatePicker和TimePicker对话框,或者是...
`android日期时间选择器(年月日时分秒)`是一个常见的需求,旨在为用户提供方便、直观的日期和时间选择体验。在这个场景下,我们可以使用自定义的日期时间选择器,例如`CustomDatePicker`,它是开发者`liuwan1992`...
在Android开发中,时间选择器(DatePicker)是一个常见的组件,用于让用户方便地选取日期或时间。本项目仿照苹果iOS的界面设计,提供了一个自定义的时间选择器,允许开发者进行高度自定义,如修改背景、字体等样式。...
在Android开发中,显示当前日期和时间是一项基本任务,它涉及到对系统时钟的访问以及UI...通过熟练掌握这些,你可以进一步扩展功能,例如添加自定义日期选择器或时间选择器,或者根据用户需求动态调整日期时间格式。
在Android开发中,时间选择器是一个非常常见的组件,它允许用户方便地选择日期和时间。本文将深入探讨如何在Android应用中实现一个功能完善的时间选择器,并分享相关的代码实现。 首先,Android SDK提供了两种内置...
本示例“android日期时间选择器”提供了一种自定义解决方案,以弥补原生Android日期时间控件功能的不足。下面我们将深入探讨这个话题。 首先,Android原生系统提供了两种基本的日期时间选择器:DatePicker和...
在本教程中,我们将探讨如何在Android应用中实现一个类似于iPhone样式的日期时间选择器。 首先,我们需要理解Android的日期和时间选择器的基本组件。Android SDK提供了`DatePicker`和`TimePicker`这两个视图来分别...
同时,确保在用户选择过程中进行合法性检查,防止选择无效的日期和时间组合。 在实际开发中,你可能还需要处理一些额外的需求,例如国际化支持,使日期和时间选择器能够适应不同的语言和文化习惯。此外,可以将这两...
2. 使用第三方库:有一些开源库如`MaterialDateTimePicker`提供了一种更美观、更易用的方式,允许开发者在一个视图中同时选择日期和时间。该库支持Material Design风格,并提供了丰富的自定义选项。 3. Java/Kotlin...
"android 自定义时间日期选择器"是一个专门为Android平台设计的自定义组件,它允许用户以一种新颖的方式选择日期和时间,提供了不同于系统默认的日期时间选择器的交互体验。这个控件的源码已经提供,并且经过验证...
在Android开发中,`DatePicker`和`TimePicker`是两种常用的控件,它们允许用户方便地选择日期和时间。在创建一个自定义的对话框(Dialog)时,这两个控件非常实用,可以提供用户友好的界面来输入日期或时间信息。...
在Android开发中,日期时间选择器是用户界面中常见的组件,用于让用户方便地选取特定的日期和时间。本文将深入探讨Android系统自带的日期时间选择器,并分别介绍4.4系统及以上以及4.4系统以下两种不同风格的实现方式...
在Android开发中,日期时间选择对话框是用户界面中常见的一种元素,用于让用户方便地选取日期和时间。本文将深入探讨如何在Android应用中创建一个简单的日期时间选择对话框,并提供一个适合新手入门的实例。 首先,...