业务场景如下:类中有一个显示 yyyy-mm日期格式的组件。点击组件 弹出日期选择器弹出框,当选择好日期确定 可以对组件重新赋值,弹出框默认显示为上一次选择的日期。选择的时间不能大于当前时间。
源码如下:
package net.demo.shijianxuanze;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
TextView tv_time;//显示选择日期
private Calendar calendar;// 用来装日期的
CusDatePicDialog dialog; //日期选择弹出框
RelativeLayout linearlayout_biaoti;//点击位置,弹出弹出框
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_time=(TextView) findViewById(R.id.tv_time);
linearlayout_biaoti=(RelativeLayout) findViewById(R.id.linearlayout_biaoti);
linearlayout_biaoti.setOnClickListener(this);
calendar = Calendar.getInstance();
//初始化 首先获取到当前系统时间,对textView 赋值。
int month = calendar.get(Calendar.MONTH) + 1;//得到的月份要+1.以为Android 月份是从0开始,代表咱们的1
String time = calendar.get(Calendar.YEAR) + "-" + month;
tv_time.setText(time);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.linearlayout_biaoti:
calendar = Calendar.getInstance();
String s=tv_time.getText().toString().trim();
//将tv_time 显示的字符串类型日期,转换为 时间格式。
Date date=getnianyue(s);
//防止出现空异常。做个判断,我觉得基本不会出现空异常
if(date==null){
dialog = new CusDatePicDialog(MainActivity.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// TODO Auto-generated method stub
String newtime=year + "-" + (monthOfYear + 1);
String oldtime=calendar.get(Calendar.YEAR)+"-"+
(calendar.get(Calendar.MONTH)+1);
如果参数1大于参数2 ,返回false
boolean flag=comparetimess(newtime,oldtime);
if(flag){//如果参数1大于参数2 ,返回false
tv_time.setText(year + "-" + (monthOfYear + 1));
}
else{
Toast.makeText(MainActivity.this,
"选择时间不能大于当前时间",1000).show();
return;
}
}
}, calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
}else{
//获取到 字符串转换为时间的 年,和月,,其实就是想让弹出框显示的年月是你上一次选择的年月
int year=date.getYear();
year=year+1900;//得到的年是 相对于1900年的差,所以要+1900
int month=date.getMonth();
month=month;
dialog = new CusDatePicDialog(MainActivity.this,
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// TODO Auto-generated method stub
//获取到你选择 的时间
String newtime=year + "-" + (monthOfYear + 1);
//获取到当前系统时间
String oldtime=calendar.get(Calendar.YEAR)+"-"+
(calendar.get(Calendar.MONTH)+1);
如果参数1大于参数2 ,返回false 选择时间不能超过当前时间。
boolean flag=comparetimess(newtime,oldtime);
if(flag){如果参数1大于参数2 ,返回false
tv_time.setText(year + "-" + (monthOfYear + 1));
}
else{
Toast.makeText(MainActivity.this,
"选择时间不能大于当前时间",1000).show();
return;
}
}
}, year,month,5);
}
//显示弹出框
dialog.show();
dialog.setTitle("请选择日期");
//得到dialog 内部组件
DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow()
.getDecorView());
//这部分效果实现,当时原理还是不太懂。。
if (dp != null) {
//不让年显示
/*((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0))
.getChildAt(0).setVisibility(View.GONE);*/
//不让月显示
/*((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0))
.getChildAt(1).setVisibility(View.GONE);*/
// 不让 日显示
((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0))
.getChildAt(2).setVisibility(View.GONE);
}
break;
}
}
private DatePicker findDatePicker(ViewGroup group) {
if (group != null) {
for (int i = 0, j = group.getChildCount(); i < j; i++) {
View child = group.getChildAt(i);
if (child instanceof DatePicker) {
return (DatePicker) child;
} else if (child instanceof ViewGroup) {
DatePicker result = findDatePicker((ViewGroup) child);
if (result != null)
return result;
}
}
}
return null;
}
/**
* @author 作者:xx 方法描述: 字符串转换成日期
* @return
*/
public static Date getnianyue(String param) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Date date = null;
try {
date = sdf.parse(param);// 把字符串转换成日期
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
// 重写DatePickerDialog 为了一直让标题内容不变
class CusDatePicDialog extends DatePickerDialog {
//这里面后三个参数是为了初始化 dialog的内容
public CusDatePicDialog(Context context, OnDateSetListener callBack,
int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
// TODO Auto-generated constructor stub
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
// TODO Auto-generated method stub
super.onDateChanged(view, year, month, day);
dialog.setTitle("请选择日期");
}
}
/**
*
* @author 作者:xx 方法描述:比较两个时间的大小 time1>time2 返回false time1
* @param 参数描述
* 格式为yyyy年MM月dd日 HH:mm:ss
* @return 返回值描述
* @throws <异常类型> {@inheritDoc} 异常描述
*/
public static Boolean comparetimess(String time1, String time2) {
java.text.DateFormat df = new java.text.SimpleDateFormat(
"yyyy-MM");
java.util.Calendar c1 = java.util.Calendar.getInstance();
java.util.Calendar c2 = java.util.Calendar.getInstance();
try {
c1.setTime(df.parse(time1));
c2.setTime(df.parse(time2));
int result = c1.compareTo(c2);
if (result <= 0) {
return true;
} else {
return false;
}
} catch (Exception e) {
}
return false;
}
}
布局文件如下:
android:layout_width="match_parent"
android:layout_height="match_parent"
>
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@+id/shebei_duibi_titlebar"
android:background="@drawable/shape_xlist_item_hui"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:gravity="center"
android:layout_marginTop="5dp"
>
android:layout_width="55dp"
android:layout_height ="wrap_content"
android:gravity="center"
android:text="123"
android:layout_centerVertical="true"
/>
android:layout_height="wrap_content"
android:src="@drawable/xia"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/tv_time"
/>
背景如下:
android:color="#777777"
/>