今天遇到一个时间弹出框的问题, 就是想用时间框的取消按钮清空文本显示的日期数据。
然而取消按钮每次都要调用OnDateSetListener.onDateSet方法,就会影响取消按钮完成的功能!
下面是我一步一步完成的过程,这样我觉得对大家的帮助也会很大(比直接给出)!
1.先说说一个自定义的时间弹出框,点击TextView,就弹出时间框
2.添加确定、取消按钮
3.取消和确定按钮分别完成功能,和之间的问题
一、自定义时间的弹出框
其实只是使用了jar包的DatePickerDialog(android.app.DatePickerDialog),在使用中,直接像TextView在布局文件中使用就可以了!
创建一个类DatePickerInput继承TextView:
(这里的确定和取消按钮都可以设置文本框的日期)
public class DatePickInput extends TextView {
//构造方法
public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DatePickInput(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DatePickInput(Context context) {
super(context);
}
@Override
protected void onFinishInflate() {
//是否处在编辑模式,不能进行编辑
if (isInEditMode()) {
return;
}
//设置不可聚焦,避免TextView的输入
setFocusable(false);
//时间格式
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
//日历,获取日期
final Calendar c = Calendar.getInstance();
//DatePickInput的点击事件
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//时间
Date date = new Date();
try {
//从文本获取日期
date = dateFormat.parse(getText().toString());
}
catch (ParseException e) {
}
//将日历的时间修改为文本的显示日期
c.setTime(date);
//创建时间框,第一个参数是上下文,第二个参数是style,第三个参数是回调方法
//后面三个参数是时间框弹出时显示的日期
new DatePickerDialog(getContext(),com.example.test.R.style.dialog, new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//将日历日期改为我们设置的日期
c.set(year, monthOfYear, dayOfMonth);
//修改文本显示日期
setText(dateFormat.format(c.getTime()));
}
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH))
.show();
}
});
}
}
二、添加确定和取消按钮
在上面的程序当中有确定和取消按钮,而且可以通过点击事件触发OnDateListener.onDateSet方法修改文本框的日期显示!
但是,我想要使用确定和取消按钮分别完成一个功能,这样就不能区分了(确定和取消都要调用OnDateListener.onDateSet方法)!
所以要自己分别添加这两个按钮,取消回调方法OnDateListener.onDateSet:
public class DatePickInput extends TextView {
private DatePickerDialog mDialog;
//构造方法
public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DatePickInput(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DatePickInput(Context context) {
super(context);
}
@Override
protected void onFinishInflate() {
//是否处在编辑模式,不能进行编辑
if (isInEditMode()) {
return;
}
//设置不可聚焦,避免TextView的输入
setFocusable(false);
//时间格式
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
//日历,获取日期
final Calendar c = Calendar.getInstance();
//DatePickInput的点击事件
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//时间
Date date = new Date();
try {
//从文本获取日期
date = dateFormat.parse(getText().toString());
}
catch (ParseException e) {
}
//将日历的时间修改为文本的显示日期
c.setTime(date);
//创建时间框,第一个参数是上下文,第二个参数是style,第三个参数是回调方法
//后面三个参数是时间框弹出时显示的日期
mDialog = new DatePickerDialog(getContext(),com.example.test.R.style.dialog,null,
c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
//添加时间框的确定按钮,其实setButton是AlertDialog中的方法,DatePickerDialog继承过来的
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//将文本内容置为“1111”
setText("1111");
}
});
//添加时间框的取消按钮
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//将文本内容置为空
setText("");
}
});
//时间框显示
mDialog.show();
}
});
}
}
三、取消清空文本、确定添加日期
现在问题就是确定按钮怎么为文本框设置日期:
(1)通过OnDateListener.onDateSet回调方法设置日期(确定和取消按钮点击就会触发该方法),就会使取消按钮失效(不采用)
(2)通过确定按钮设置,就需要使用DatePickerDialog中的DatePicker来获取用户设置的时间:
public class DatePickInput extends TextView {
private DatePickerDialog mDialog;
//构造方法
public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DatePickInput(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DatePickInput(Context context) {
super(context);
}
@Override
protected void onFinishInflate() {
//是否处在编辑模式,不能进行编辑
if (isInEditMode()) {
return;
}
//设置不可聚焦,避免TextView的输入
setFocusable(false);
//时间格式
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
//日历,获取日期
final Calendar c = Calendar.getInstance();
//DatePickInput的点击事件
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//时间
Date date = new Date();
try {
//从文本获取日期
date = dateFormat.parse(getText().toString());
}
catch (ParseException e) {
}
//将日历的时间修改为文本的显示日期
c.setTime(date);
//创建时间框,第一个参数是上下文,第二个参数是style,第三个参数是回调方法
//后面三个参数是时间框弹出时显示的日期
mDialog = new DatePickerDialog(getContext(),com.example.test.R.style.dialog,null,
c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
//添加时间框的确定按钮,其实setButton是AlertDialog中的方法,DatePickerDialog继承过来的
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//将文本内容置为时间框中选择的日期
//通过mDialog.getDatePicker()获得dialog上的DatePicker组件,然后可以获取日期信息
DatePicker datePicker = mDialog.getDatePicker();
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
c.set(year, month, day);
setText(dateFormat.format(c.getTime()));
}
});
//添加时间框的取消按钮
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//将文本内容置为空
setText("");
}
});
//时间框显示
mDialog.show();
}
});
}
}
这样就完成了DatePickerDialog的确定设置文本的日期和取消按钮清空文本!