在项目中,发现使用日期选择器的时候,不同手机系统日期选择框显示的日期不同,有的是中文的,有的是英文!之前以为是系统语言的问题,后面发现其实不是,是Android的日期选择框的bug。
一、现附上效果图,图片的黑白,只是主题不同而已
二、现在给出将月份都转换成数字的方法:
1、首先提供两个链接,帮助理解
(1)将日期选择框的年月日进行排序 http://blog.csdn.net/lintcgirl/article/details/50476684
(2)将日期选择框的月份进行值范围设置 http://blog.csdn.net/jb521125/article/details/17042083
注:1、排序年月日,是防止在获取月份的NumberPicker不会出现数组越界异常,因为不同手机他的排序是不同的
2、使用Locale.CHINA并不能解决英文的问题
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
Calendar c = Calendar.getInstance(Locale.CHINA);
2、写一个NewDatePicker类继承DatePickerDialog
import android.app.DatePickerDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
/**
* 重写DatePickerDialog
* @author Administrator
* 将不同系统月份英文修改为数字
*/
public class NewDatePicker extends DatePickerDialog{
/**
* 月份的取值
*/
private String[] mDisplayMonths = {"1", "2", "3","4", "5", "6","7", "8", "9","10", "11", "12"};
/**
* 构造方法
* @param context
* @param callBack
* @param year
* @param monthOfYear
* @param dayOfMonth
*/
public NewDatePicker(Context context, OnDateSetListener callBack, int year,
int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
// TODO Auto-generated constructor stub
}
public NewDatePicker(Context context, int theme,
OnDateSetListener callBack, int year, int monthOfYear,
int dayOfMonth) {
super(context, theme, callBack, year, monthOfYear, dayOfMonth);
// TODO Auto-generated constructor stub
}
/**
* 重新排序 年月日(英文会出现 月 日 年的情况,所以需要排序)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LinearLayout mSpinners = (LinearLayout) findViewById(getContext().getResources().getIdentifier("android:id/pickers", null, null));
if (mSpinners != null) {
NumberPicker mYearSpinner = (NumberPicker) findViewById(getContext().getResources().getIdentifier("android:id/year", null, null));
NumberPicker mMonthSpinner = (NumberPicker) findViewById(getContext().getResources().getIdentifier("android:id/month", null, null));
NumberPicker mDaySpinner = (NumberPicker)findViewById(getContext().getResources().getIdentifier("android:id/day", null, null));
mSpinners.removeAllViews();
if (mYearSpinner != null) {
mSpinners.addView(mYearSpinner);
}
if (mMonthSpinner != null) {
mSpinners.addView(mMonthSpinner);
}
if (mDaySpinner != null) {
mSpinners.addView(mDaySpinner);
}
}
}
/**
* 有了年月日的正常顺序,下面的代码就不会出现数组越界异常
*/
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
// TODO Auto-generated method stub
super.onDateChanged(view, year, month, day);
setTitle(year+"年 "+(month+1)+"月 "+day+"日");
//关键行
((NumberPicker)((ViewGroup)((ViewGroup)view.getChildAt(0)).getChildAt(0)).getChildAt(1)).setDisplayedValues(mDisplayMonths);
}
}
3、上面只是设置了滑动的动态变换,我们在使用的时候要进行初始设置
package com.yuehe.car.view;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.NumberPicker;
import android.widget.TextView;
public class DatePickInput extends TextView {
/**
* 日期框
*/
private NewDatePicker mDialog;
private Context context;
/**
* 月份的取值
*/
private String[] mDisplayMonths = {"1", "2", "3","4", "5", "6","7", "8", "9","10", "11", "12"};
public DatePickInput(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
public DatePickInput(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public DatePickInput(Context context) {
super(context);
this.context = context;
}
@Override
protected void onFinishInflate() {
if (isInEditMode()) {
return;
}
setFocusable(false);
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
final Calendar c = Calendar.getInstance(Locale.CHINA);
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);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
mDialog = new NewDatePicker(getContext(),
AlertDialog.THEME_HOLO_LIGHT,null,year,month,day);
mDialog.setTitle(year+"年 "+(month+1)+"月 "+day+"日");
mDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DatePicker datePicker = mDialog.getDatePicker();
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
c.set(year, month, day);
Date date = c.getTime();
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
setText(dateFormat.format(c.getTime()));
}
});
mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
setText("");
}
});
mDialog.show();
/**
* 初始设置月份
*/
DatePicker dp = mDialog.getDatePicker();
if (dp != null) {
((NumberPicker)((ViewGroup)((ViewGroup)dp.getChildAt(0)).getChildAt(0)).getChildAt(1)).setDisplayedValues(mDisplayMonths);
}
}
});
}
}
4、使用,只需要在配置文件中使用自定义的TextView( DatePickInput)就可以了,一点击就会弹出日期选择框
注:这里只是简单怎么使用,使用的时候还是根据你界面来直接使用就可以了
<你的包的路径.DatePickInput
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_marginRight="20dp"
android:background="@color/white"
android:gravity="right|center_vertical"
android:hint="请选择日期"
android:inputType="datetime"
android:focusable="false"
android:maxLength="50"
android:singleLine="true"
android:textColorHint="@color/hint" />