datePickerDialog年月选择弹框 自定义 拿来就用

先上效果图

datePickerDialog年月选择弹框 自定义 拿来就用_第1张图片

概述

类似这种功能可以使用系统的控件来完成 datePickerDialog和timoPickerDialog
但是系统的只有一个完成按钮 没有取消按钮 系统的样式无法自定义
所以 搜了个自定义的时间选择 主要是只需要选择年月 不需要选择日期

MyDatePickerDialog.java

public class MyDatePickerDialog extends AlertDialog implements
        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 mTitleNeedsUpdate = true;

    private View view;

    /**
     * The callback used to indicate the user is done filling in the date.
     */
    public interface OnDateSetListener {
        void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth);
    }

    public MyDatePickerDialog(Context context, OnDateSetListener callBack,
            int year, int monthOfYear, int dayOfMonth) {
        this(context, 0, callBack, year, monthOfYear, dayOfMonth);
    }

    public MyDatePickerDialog(Context context, int theme,
            OnDateSetListener listener, int year, int monthOfYear,
            int dayOfMonth) {
        super(context, theme);

        mDateSetListener = listener;
        mCalendar = Calendar.getInstance();

        Context themeContext = getContext();
        LayoutInflater inflater = LayoutInflater.from(themeContext);
        view = inflater.inflate(R.layout.date_picker_dialog, null);
        view.setBackgroundColor(Color.WHITE);
        // setView(view);

        // setButton(BUTTON_POSITIVE, themeContext.getString(R.string.ok),
        // this);
        // setButton(BUTTON_NEGATIVE, themeContext.getString(R.string.cancel),
        // this);
        // setButtonPanelLayoutHint(LAYOUT_HINT_SIDE);

        mDatePicker = (DatePicker) view.findViewById(R.id.datePicker);
        // TODO 设置显示的最大值范围
        mDatePicker.setMaxDate(System.currentTimeMillis() - 1000L);
        mDatePicker.init(year, monthOfYear, dayOfMonth, this);

        // mDatePicker.setValidationCallback(mValidationCallback);
        // 实现自己的标题和ok按钮
        // setTitle("选择日期:");
        setButton();
    }

    // private void setTitle(String title) {
    // //获取自己定义的title布局并赋值。
    // ((TextView) view.findViewById(R.id.date_picker_title)).setText(title);
    // }
    private void setButton() {
        // 获取自己定义的响应按钮并设置监听,直接调用构造时传进来的CallBack接口(为了省劲,没有自己写接口,直接用之前本类定义好的)同时关闭对话框。
        view.findViewById(R.id.date_picker_ok).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        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());
                            dismiss();
                        }
                    }
                });
        view.findViewById(R.id.date_picker_cancle).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        cancel();
                    }
                });
    }

    public void myShow() {
        // 自己实现show方法,主要是为了把setContentView方法放到show方法后面,否则会报错。
        show();
        setContentView(view);
    }

    @Override
    public void onDateChanged(DatePicker view, int year, int month, int day) {
        mDatePicker.init(year, month, day, this);

    }

    /**
     * Gets the {@link DatePicker} contained in this dialog.
     * 
     * @return The calendar view.
     */
    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);
    }

}

date_picker_dialog.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:calendarViewShown="false" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/date_picker_ok"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="查询"
            android:textColor="#000" />

        <TextView
            android:id="@+id/date_picker_cancle"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="取消"
            android:textColor="#000" />
    LinearLayout>

LinearLayout>

在Activity中的使用

    private int year;
    private int monthOfYear;
    private int dayOfMonth;
    /** 选择日期的dialog **/
    private MyDatePickerDialog myDatePickerDialog;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mounth_order);
        rootView = (LinearLayout) findViewById(R.id.rootView);
        // 点击导航栏的返回按钮的点击事件
        Button back = (Button) findViewById(R.id.more_nav_bar_left_btn);
        back.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        getNowTime();
        showDatePicker2();
    }

    private void getNowTime() {
        Calendar now = Calendar.getInstance(); 
        year = now.get(Calendar.YEAR);
        monthOfYear = now.get(Calendar.MONTH) ;
        dayOfMonth = now.get(Calendar.DAY_OF_MONTH);
    }

/**
     * 展示选择时间的dialog
     *@Description: (这里用一句话描述这个方法的作用) 
     *@Author: 郭永振
     *@Since: 2017-1-6下午3:33:51
     */
    public void showDatePicker2() {
    myDatePickerDialog = new MyDatePickerDialog(this,android.R.style.Theme_Holo_Light_Dialog_NoActionBar,
                new MyDatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year,int monthOfYear, int dayOfMonth) {
                        int month = monthOfYear + 1;
                        Toast.makeText(MounthOrderActivity.this,year + "-" + month,Toast.LENGTH_SHORT).show();

                    }
                }, year, monthOfYear, dayOfMonth);
        myDatePickerDialog.myShow();

        // 将对话框的大小按屏幕大小的百分比设置
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = myDatePickerDialog.getWindow().getAttributes();
        lp.width = (int)(display.getWidth() * 0.8); //设置宽度
        myDatePickerDialog.getWindow().setAttributes(lp);

        // 去掉显示日  只显示年月
        ((ViewGroup)((ViewGroup) myDatePickerDialog.getDatePicker().getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE);  
    }

你可能感兴趣的:(拿来就用)