android 年月日選擇器(可選擇年,年月,年月日)
阿新 • • 發佈:2019-01-22
首先是兩個佈局檔案
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/ymd" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="年月日"/> <Button android:id="@+id/ym" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="年月"/> <Button android:id="@+id/y" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="年"/> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" android:text=""/> </LinearLayout>
view_date_picker_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <RelativeLayout android:id="@+id/contentLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:gravity="center_horizontal" android:orientation="vertical" android:paddingTop="10dp"> <DatePicker android:id="@+id/datePicker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:calendarViewShown="false" android:datePickerMode="spinner"/> <View android:id="@+id/buttonHorizontalDivider" android:layout_width="match_parent" android:layout_height="1px" android:layout_below="@+id/datePicker" android:background="#ff464646"/> <LinearLayout android:id="@+id/buttonGroup" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/buttonHorizontalDivider" android:orientation="horizontal"> <Button android:id="@+id/cancelButton" style="?android:attr/borderlessButtonStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@android:string/cancel"/> <!-- The vertical divider line between the two buttons --> <View android:id="@+id/buttonVerticalDivider" android:layout_width="1px" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:background="#ff464646"/> <Button android:id="@+id/okButton" style="?android:attr/borderlessButtonStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@android:string/ok"/> </LinearLayout> </RelativeLayout> </LinearLayout>
兩個java檔案
MainActivity.java
package com.example.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity implements View.OnClickListener,DateTimeDialogOnlyYMD.MyOnDateSetListener { Button ymd,ym,y; TextView time; private DateTimeDialogOnlyYMD dateTimeDialogOnlyYM; private DateTimeDialogOnlyYMD dateTimeDialogOnlyYMD; private DateTimeDialogOnlyYMD dateTimeDialogOnlyYear; // private SimpleDateFormat mFormatter = new SimpleDateFormat("yyyy-MM-dd"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dateTimeDialogOnlyYMD = new DateTimeDialogOnlyYMD(this, this, true, true, true); dateTimeDialogOnlyYM = new DateTimeDialogOnlyYMD(this, this, false, true, true); dateTimeDialogOnlyYear = new DateTimeDialogOnlyYMD(this, this, false, false, true); initView(); } public void initView(){ time = (TextView) findViewById(R.id.time); ymd = (Button) findViewById(R.id.ymd); ymd.setOnClickListener(this); ym = (Button) findViewById(R.id.ym); ym.setOnClickListener(this); y = (Button) findViewById(R.id.y); y.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.ymd: showYMD(); break; case R.id.ym: showYM(); break; case R.id.y: showYear(); break; } } private void showYear() { dateTimeDialogOnlyYear.hideOrShow(); } private void showYM() { dateTimeDialogOnlyYM.hideOrShow(); } private void showYMD() { dateTimeDialogOnlyYMD.hideOrShow(); } @Override public void onDateSet(Date date,int type) { String str = mFormatter.format(date); String[] s = str.split("-"); if (type ==1){ time.setText(s[0]); }else if (type ==2){ time.setText(s[0]+"-"+s[1]); }else if (type ==3){ time.setText(s[0]+"-"+s[1]+"-"+s[2]); } } }
DateTimeDialogOnlyYMD.java
package com.example.myapplication;
import android.app.AlertDialog;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import java.util.Calendar;
import java.util.Date;
/**
* 自定義 日期 選擇 器 只能選擇 日月年
* Created by Administrator on 2016/6/22.
*/
public class DateTimeDialogOnlyYMD extends AlertDialog implements View.OnClickListener {
private DatePicker mDatePicker;
private MyOnDateSetListener onDateSetListener;
private Button cancleButton, okButton;
// 控制 日期
private int measureWidth;
// 是否 顯示 日選擇器 true 顯示 ,false 隱藏
private boolean isDayVisible = true;
// 是否 顯示 月選擇器 true 顯示 ,false 隱藏
private boolean isMonthVisible = true;
// 是否 顯示 年選擇器 true 顯示 ,false 隱藏
private boolean isYearVisible = true;
protected DateTimeDialogOnlyYMD(Context context) {
super(context);
}
protected DateTimeDialogOnlyYMD(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
/**
* @param context 上下文物件
* @param callBack 選擇 監聽器
* @param isDayVisible 日 是否可見
* @param isMonthVisible 月 是否可見
* @param isYearVisible 年 是否可見
*/
public DateTimeDialogOnlyYMD(Context context, MyOnDateSetListener callBack, boolean isDayVisible, boolean isMonthVisible, boolean isYearVisible) {
super(context);
this.isDayVisible = isDayVisible;
this.isMonthVisible = isMonthVisible;
this.isYearVisible = isYearVisible;
this.onDateSetListener = callBack;
this.isDayVisible = isDayVisible;
init();
}
private void init() {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.view_date_picker_dialog, null);
setView(view);
mDatePicker = (DatePicker) view.findViewById(R.id.datePicker);
LinearLayout buttonGroup = (LinearLayout) view.findViewById(R.id.buttonGroup);
cancleButton = (Button) view.findViewById(R.id.cancelButton);
okButton = (Button) view.findViewById(R.id.okButton);
Calendar mCalendar = Calendar.getInstance();
mCalendar.setTime(new Date());
cancleButton.setOnClickListener(this);
okButton.setOnClickListener(this);
// 是否 顯示 年
if (!this.isYearVisible) {
((ViewGroup) ((ViewGroup) mDatePicker.getChildAt(0)).getChildAt(0)).getChildAt(0).setVisibility(View.GONE);
}
// 是否 顯示 月
if (!this.isMonthVisible) {
((ViewGroup) ((ViewGroup) mDatePicker.getChildAt(0)).getChildAt(0)).getChildAt(1).setVisibility(View.GONE);
}
// 是否 顯示 日
if (!this.isDayVisible) {
((ViewGroup) ((ViewGroup) mDatePicker.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE);
}
// 設定 顯示 寬高
int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int height = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
buttonGroup.measure(width, height);
mDatePicker.measure(width, height);
if (buttonGroup.getMeasuredWidth() > mDatePicker.getMeasuredWidth()) {
this.measureWidth = buttonGroup.getMeasuredWidth();
} else {
this.measureWidth = mDatePicker.getMeasuredWidth();
}
// Log.i("testss", this.measureWidth + "measuredWidth");
}
public void hideOrShow() {
if (this == null) {
return;
}
if (!this.isShowing()) {
this.show();
//設定 顯示 的 寬高
WindowManager.LayoutParams attributes = this.getWindow().getAttributes();
attributes.width = this.measureWidth + 100;
this.getWindow().setAttributes(attributes);
} else {
this.dismiss();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.cancelButton:
dismiss();
break;
case R.id.okButton:
if (isYearVisible == true && isMonthVisible == false && isDayVisible == false){
Log.e("type","年選擇器");
onOkButtonClick(1);
}else if (isYearVisible == true && isMonthVisible == true && isDayVisible == false){
Log.e("type","年月選擇器");
onOkButtonClick(2);
}else if (isYearVisible == true && isMonthVisible == true && isDayVisible == true){
Log.e("type","年月日選擇器");
onOkButtonClick(3);
}
dismiss();
break;
}
}
/**
* 確認 按鈕 點選 事件
*/
private void onOkButtonClick(int type) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, mDatePicker.getYear());
calendar.set(Calendar.MONTH, mDatePicker.getMonth());
calendar.set(Calendar.DAY_OF_MONTH, mDatePicker.getDayOfMonth());
calendar.getTime();
if (onDateSetListener != null) {
if (type == 1){
onDateSetListener.onDateSet(calendar.getTime(),1);
}else if (type ==2){
onDateSetListener.onDateSet(calendar.getTime(),2);
}else if (type ==3){
onDateSetListener.onDateSet(calendar.getTime(),3);
}
}
Log.i("testss", mDatePicker.getYear() + "====" + (mDatePicker.getMonth() + 1) + "==" + mDatePicker.getDayOfMonth());
}
/**
* 時間 改變 監聽
*/
public interface MyOnDateSetListener {
void onDateSet(Date date,int type);
}
}
親測可用,由於程式碼量不多,就不上傳整個專案了。