Android開發(fā)之輕松打造DatePickterDialog可自由選擇顯示Day或者隱藏

源碼已上傳到碼云:https://git.oschina.net/osczaizai/AndroidDemo

更多開發(fā)分享請移步:http://cherylgood.cn

通過反射將datepickter里面的dayView隱藏充边,增加了幾個接口

package guanaj.com.easydatepickerdialog;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.res.Resources;

import android.os.Build;

import android.os.Bundle;

import android.text.format.DateUtils;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.Button;

import android.widget.DatePicker;

import java.lang.reflect.Field;

import java.util.Calendar;

/**

* Created by guanaj on 2017/3/7.

*/

class EasyDatePickerDialog extends AlertDialog implements DialogInterface.OnClickListener,

DatePicker.OnDateChangedListener {

private static final String YEAR = "year";

private static final String MONTH = "month";

private static final String DAY = "day";

private final DatePicker mDatePicker;

private final OnDateSetListener mDateSetListener;

private final Calendar mCalendar;

private boolean mHidDay =false;

private Context mContext;

public interface OnDateSetListener {

void onDateSet(DatePicker startDatePicker, int startYear, int startMonthOfYear, int startDayOfMonth);

}

private boolean mTitleNeedsUpdate = true;

public EasyDatePickerDialog(Context context,

OnDateSetListener callBack,

int year,

int monthOfYear,

int dayOfMonth,boolean hidDay) {

this(context, 0, callBack, year, monthOfYear, dayOfMonth,hidDay);

}

public EasyDatePickerDialog(Context context, int theme, OnDateSetListener listener, int year,

int monthOfYear, int dayOfMonth,boolean hidDay) {

super(context,? theme);

mDateSetListener = listener;

mCalendar = Calendar.getInstance();

mHidDay = hidDay;

mContext = getContext();

final LayoutInflater inflater = LayoutInflater.from(mContext);

final View view = inflater.inflate(R.layout.easydatepickterview, null);

setButton(BUTTON_POSITIVE, "確定", this);

setButton(BUTTON_NEGATIVE, "取消", this);

//setIcon(0); //移除按鈕效果

setView(view);

mDatePicker = (DatePicker) view.findViewById(R.id.easydatePicker);

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

if (hidDay) {

hideDayView(mDatePicker);

}

}

private void hideDayView(DatePicker mDatePicker) {

try {

/* android5.0以上 */

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

int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");

if (daySpinnerId != 0) {

View daySpinner = mDatePicker.findViewById(daySpinnerId);

if (daySpinner != null) {

daySpinner.setVisibility(View.GONE);

}

}

} else {

Field[] datePickerfFields = mDatePicker.getClass().getDeclaredFields();

for (Field datePickerField : datePickerfFields) {

if ("mDaySpinner".equals(datePickerField.getName()) || ("mDayPicker").equals(datePickerField.getName())) {

datePickerField.setAccessible(true);

Object dayPicker = new Object();

try {

dayPicker = datePickerField.get(mDatePicker);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

}

((View) dayPicker).setVisibility(View.GONE);

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

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

if (view.getId()==R.id.easydatePicker) {

mDatePicker.init(year, month, day, this);

//可根據(jù)需要在此處更新title

}

}

@Override

public void onClick(DialogInterface dialog, int which) {

switch (which) {

case BUTTON_POSITIVE:

if (mDateSetListener != null) {

// Clearing focus forces the dialog to commit any pending

// changes, e.g. typed text in a NumberPicker.

mDatePicker.clearFocus();

mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(),

mDatePicker.getMonth(), mDatePicker.getDayOfMonth());

}

break;

case BUTTON_NEGATIVE:

cancel();

break;

}

}

public DatePicker getDatePicker() {

return mDatePicker;

}

public void updateDate(int year, int monthOfYear, int dayOfMonth) {

mDatePicker.updateDate(year, monthOfYear, dayOfMonth);

}

@Override

public Bundle onSaveInstanceState() {

final Bundle state = super.onSaveInstanceState();

state.putInt(YEAR, mDatePicker.getYear());

state.putInt(MONTH, mDatePicker.getMonth());

state.putInt(DAY, mDatePicker.getDayOfMonth());

return state;

}

@Override

public void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

final int year = savedInstanceState.getInt(YEAR);

final int month = savedInstanceState.getInt(MONTH);

final int day = savedInstanceState.getInt(DAY);

mDatePicker.init(year, month, day, this);

}

public void setMaxDate(int year,int month,int day){

mCalendar.set(year,month-1,day);

mDatePicker.setMaxDate(mCalendar.getTimeInMillis());

}

public void setMinDate(int year,int month,int day){

mCalendar.set(year,month-1,day);

mDatePicker.setMinDate(mCalendar.getTimeInMillis());

}

}

布局文件:

http://cherylgood.cn/20170307/62

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双饥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子可霎,更是在濱河造成了極大的恐慌水援,老刑警劉巖密强,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裹唆,居然都是意外死亡誓斥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門许帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳坑,“玉大人,你說我怎么就攤上這事成畦【喾遥” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵循帐,是天一觀的道長框仔。 經(jīng)常有香客問我,道長拄养,這世上最難降的妖魔是什么离斩? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任银舱,我火速辦了婚禮,結果婚禮上跛梗,老公的妹妹穿的比我還像新娘寻馏。我一直安慰自己,他們只是感情好核偿,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布诚欠。 她就那樣靜靜地躺著,像睡著了一般漾岳。 火紅的嫁衣襯著肌膚如雪轰绵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天尼荆,我揣著相機與錄音左腔,去河邊找鬼。 笑死捅儒,一個胖子當著我的面吹牛翔悠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播野芒,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蓄愁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狞悲?” 一聲冷哼從身側響起撮抓,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摇锋,沒想到半個月后丹拯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡荸恕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年乖酬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融求。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡咬像,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出生宛,到底是詐尸還是另有隱情县昂,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布陷舅,位于F島的核電站倒彰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莱睁。R本人自食惡果不足惜待讳,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一芒澜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧创淡,春花似錦撰糠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨袒。三九已至汁针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砚尽,已是汗流浹背施无。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留必孤,地道東北人猾骡。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像敷搪,于是被迫代替她去往敵國和親兴想。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容