用系统的日期选择框来只显示年份。系统的语言格式会导致隐藏月份和日期时,隐藏了年份。
可以根据当前语言格式解析出来的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;
}
}