1. 程式人生 > >android 年月日選擇器(可選擇年,年月,年月日)

android 年月日選擇器(可選擇年,年月,年月日)

首先是兩個佈局檔案 

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);
    }

}

親測可用,由於程式碼量不多,就不上傳整個專案了。