DatePickerDialog 只显示年 (解决不同语言顺序不一样的问题)

用系统的日期选择框来只显示年份。系统的语言格式会导致隐藏月份和日期时,隐藏了年份。

可以根据当前语言格式解析出来的char[]然后顺序显示年月日的顺序,找到这个char[]里面‘y’的位置,隐藏DatePickerDialog的月份和日期的NumberPicker,以下是详细代码。

 

rl_date.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Calendar calendar = Calendar.getInstance();

try {

if (yearPickerDialog == null) {

yearPickerDialog = new YearPickerDialog(thisActivity, new DatePickerDialog.OnDateSetListener() {

@Override

public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

//请求选择年份的数据,重新加载页面

Toast.makeText(thisActivity, "选择的年份" + year, Toast.LENGTH_LONG).show();

}

}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH));

//设置最大的可选择日期

yearPickerDialog.getDatePicker().setMaxDate(calendar.getTime().getTime());

calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 4);

//设置最小的可选择日期

yearPickerDialog.getDatePicker().setMinDate(calendar.getTime().getTime());

}

//给dialog设置一个隐藏的textview作为title,用于隐藏默认的title

TextView textView = new TextView(thisActivity);

textView.setVisibility(View.GONE);

yearPickerDialog.setCustomTitle(textView);

yearPickerDialog.show();

//去除标题栏下的蓝线

int titleDivider = thisActivity.getResources().getIdentifier("android:id/titleDivider", null, null);

View view = yearPickerDialog.findViewById(titleDivider);

view.setBackgroundColor(Color.TRANSPARENT);

} catch (Exception e) {

e.printStackTrace();

}

}

});

类YearPickerDialog.java

package com.icbc.view;

 

import android.app.DatePickerDialog;

import android.content.Context;

import android.os.Build;

import android.text.format.DateFormat;

import android.util.AttributeSet;

import android.view.View;

import android.view.ViewGroup;

import android.widget.DatePicker;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.util.Arrays;

import java.util.Locale;

 

/**

* Created by liming on 2018/1/25.

*/

 

public class YearPickerDialog extends DatePickerDialog {

private DatePicker datePicker;

public YearPickerDialog(Context context, OnDateSetListener callBack,

int year, int monthOfYear, int dayOfMonth) {

super(context, callBack, year, monthOfYear, dayOfMonth);

//this.setTitle(year + "年");

try {

 

if (Build.VERSION.SDK_INT >= 24) {

//android7.0DatePicker布局不一样了

try {

final Field field = this.findField(DatePickerDialog.class,

DatePicker.class, "mDatePicker");

 

datePicker = (DatePicker) field.get(this);

final Class<?> delegateClass = Class

.forName("android.widget.DatePicker$DatePickerDelegate");

final Field delegateField = this.findField(DatePicker.class,

delegateClass, "mDelegate");

 

final Object delegate = delegateField.get(datePicker);

final Class<?> spinnerDelegateClass = Class

.forName("android.widget.DatePickerSpinnerDelegate");

 

if (delegate.getClass() != spinnerDelegateClass) {

delegateField.set(datePicker, null);

datePicker.removeAllViews();

 

final Constructor spinnerDelegateConstructor = spinnerDelegateClass

.getDeclaredConstructor(DatePicker.class,

Context.class, AttributeSet.class,

int.class, int.class);

spinnerDelegateConstructor.setAccessible(true);

 

final Object spinnerDelegate = spinnerDelegateConstructor

.newInstance(datePicker, context, null,

android.R.attr.datePickerStyle, 0);

delegateField.set(datePicker, spinnerDelegate);

 

datePicker.init(year, monthOfYear, dayOfMonth, this);

datePicker.setCalendarViewShown(false);

datePicker.setSpinnersShown(true);

}

} catch (Exception e) { /* Do nothing */

}

}

int year_index = getYearPosition();

for (int i = 0; i < 3; i++) {

 

if (year_index != i) {

((ViewGroup) ((ViewGroup) this.getDatePicker().getChildAt(0)).getChildAt(0)).getChildAt(i).setVisibility(View.GONE);

}

}

} catch (Exception e) {

}

}

 

@Override

public void onDateChanged(DatePicker view, int year, int month, int day) {

super.onDateChanged(view, year, month, day);

//this.setTitle(year + "年");

}

 

private Field findField(Class objectClass, Class fieldClass,

String expectedName) {

try {

final Field field = objectClass.getDeclaredField(expectedName);

field.setAccessible(true);

return field;

} catch (NoSuchFieldException e) { /* Ignore */

}

 

// Search for it if it wasn't found under the expectedName.

for (final Field field : objectClass.getDeclaredFields()) {

if (field.getType() == fieldClass) {

field.setAccessible(true);

return field;

}

}

 

return null;

}

 

private int getYearPosition() {

 

char[] order = null;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

String pattener = new DateFormat().getBestDateTimePattern(Locale.getDefault(), "yyyyMMdd");

order = getDateFormatOrder(pattener);

} else {

order = DateFormat.getDateFormatOrder(getContext());

}

final int spinnerCount = order.length;

 

for (int i = 0; i < spinnerCount; i++) {

System.out.println("");

switch (order[i]) {

case 'd':

break;

case 'M':

break;

case 'y':

return i;

default:

throw new IllegalArgumentException(Arrays.toString(order));

}

}

return 0;

}

 

public char[] getDateFormatOrder(String pattern) {

char[] result = new char[3];

int resultIndex = 0;

boolean sawDay = false;

boolean sawMonth = false;

boolean sawYear = false;

 

for (int i = 0; i < pattern.length(); ++i) {

char ch = pattern.charAt(i);

if (ch == 'd' || ch == 'L' || ch == 'M' || ch == 'y') {

if (ch == 'd' && !sawDay) {

result[resultIndex++] = 'd';

sawDay = true;

} else if ((ch == 'L' || ch == 'M') && !sawMonth) {

result[resultIndex++] = 'M';

sawMonth = true;

} else if ((ch == 'y') && !sawYear) {

result[resultIndex++] = 'y';

sawYear = true;

}

} else if (ch == 'G') {

// Ignore the era specifier, if present.

} else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {

throw new IllegalArgumentException("Bad pattern character '" + ch + "' in " + pattern);

} else if (ch == '\'') {

if (i < pattern.length() - 1 && pattern.charAt(i + 1) == '\'') {

++i;

} else {

i = pattern.indexOf('\'', i + 1);

if (i == -1) {

throw new IllegalArgumentException("Bad quoting in " + pattern);

}

++i;

}

} else {

// Ignore spaces and punctuation.

}

}

return result;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值