MaterialCalendarDialog【Material样式的日历对话框】

版权声明:本文为博主原创文章,未经博主允许不得转载。

前言

Material样式的日历对话框

前提条件:Activity界面必须继承FragmentActivity或者其子类(比如AppCompatActivity)

效果图

 

代码分析

对话框(MaterialCalendarDialog): extends DialogFragment

日历控件:com.prolificinteractive.materialcalendarview.MaterialCalendarView

mCalendarView.setSelectedDate(selectedDate);//设置选中的日期

mCalendarView.setCurrentDate(selectedDate);//实现定位到选中日期的当月

MySelectorBgDecorator —— 自定义选中状态下的背景

SelectedDayDecorator —— 自定义选中状态下的文本(加粗、加大字号)

TodayDecorator —— 自定义当天的文本颜色

//日历控件的点击事件
        mCalendarView.setOnDateChangedListener(new OnDateSelectedListener() {
            @Override
            public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) {
                selectedDate = date.getDate();
                parseDateToYearMonthDayWeek(selectedDate);

                //刷新选中的状态
                selectedDayDecorator.setDate(selectedDate);
                widget.invalidateDecorators();
            }
        });

使用步骤

一、项目组织结构图

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

在APP中的bundle.gradle文件中添加以下代码,引入MaterialCalendarView控件

apply plugin: ‘com.android.application‘

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.why.project.materialcalendarviewdialogdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }
}

dependencies {
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
    androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.2.2‘, {
        exclude group: ‘com.android.support‘, module: ‘support-annotations‘
    })
    compile ‘com.android.support:appcompat-v7:25.3.1‘
    testCompile ‘junit:junit:4.12‘

    //material-calendarview日历控件
    compile ‘com.prolificinteractive:material-calendarview:1.4.3‘

}

将materialcalendar包复制到项目中【注意,需要手动打开Java文件重新import R文件】

将material_calendar_decorator_selected_bg.xml文件复制到res/drawable目录中

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
          android:exitFadeDuration="@android:integer/config_shortAnimTime">

    <item android:state_checked="true">
        <shape android:shape="oval">
            <solid android:color="@color/materialcalendar_selected_color"></solid>
        </shape>
    </item>

    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="@color/materialcalendar_selected_color"></solid>
        </shape>
    </item>

    <item android:drawable="@android:color/transparent"/>

</selector>

material_calendar_decorator_selected_bg.xml

将dialog_material_calendar.xml文件复制到res/layout目录中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:gravity="center">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_margin="@dimen/material_calendar_dialog_margin"
        android:background="#ffffff">

        <!-- 展现选中的日期区域 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingTop="@dimen/material_calendar_dialog_paddingTB"
            android:paddingBottom="@dimen/material_calendar_dialog_paddingTB"
            android:paddingLeft="@dimen/material_calendar_dialog_paddingLR"
            android:paddingRight="@dimen/material_calendar_dialog_paddingLR"
            android:background="@color/materialcalendar_selected_color">

            <!-- 年份 -->
            <TextView
                android:id="@+id/tv_year"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="2017年"
                android:textSize="@dimen/material_calendar_dialog_year_textsize"
                android:textColor="#ffffff"
                />

            <!-- 月日星期 -->
            <TextView
                android:id="@+id/tv_monthday"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="9月24日  周日"
                android:textSize="@dimen/material_calendar_dialog_monthday_textsize"
                android:textColor="#ffffff"
                />
        </LinearLayout>

        <!-- 日历控件 -->
        <com.prolificinteractive.materialcalendarview.MaterialCalendarView
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/calendarView"
            android:layout_width="wrap_content"
            android:layout_height="0.0dp"
            android:layout_weight="1"
            app:mcv_showOtherDates="all"
            />

        <!-- 底部按钮区域 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="right|center_vertical"
            android:padding="@dimen/material_calendar_dialog_paddingTB">

            <!-- 取消 -->
            <TextView
                android:id="@+id/tv_cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="取消"
                android:textSize="18sp"
                android:textColor="@color/materialcalendar_selected_color"
                android:paddingRight="@dimen/material_calendar_dialog_paddingLR"/>

            <!-- 确定 -->
            <TextView
                android:id="@+id/tv_ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="确定"
                android:textSize="18sp"
                android:textColor="@color/materialcalendar_selected_color"
                android:paddingLeft="@dimen/material_calendar_dialog_paddingTB"
                android:paddingRight="@dimen/material_calendar_dialog_paddingTB"/>

        </LinearLayout>

    </LinearLayout>
</RelativeLayout>

dialog_material_calendar.xml

在colors.xml文件中添加以下代码

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <!-- ==================Material样式日历对话框================== -->
    <!-- 选中日期的背景颜色值 -->
    <color name="materialcalendar_selected_color">#476BF0</color>
    <!-- 当天日期的边框的背景颜色值 -->
    <color name="materialcalendar_today_border_color">#FF4081</color>

</resources>

在dimens.xml文件中添加以下代码

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>

    <!-- ==================Material样式日历对话框================== -->
    <!-- 对话框整体的外边距(左右) -->
    <dimen name="material_calendar_dialog_margin">30dp</dimen>
    <!-- 对话框控件的内边距(上下) -->
    <dimen name="material_calendar_dialog_paddingTB">15dp</dimen>
    <!-- 对话框控件的内边距(左右) -->
    <dimen name="material_calendar_dialog_paddingLR">20dp</dimen>

    <!-- 对话框控件的年份文本大小 -->
    <dimen name="material_calendar_dialog_year_textsize">18sp</dimen>
    <!-- 对话框控件的月日星期文本大小 -->
    <dimen name="material_calendar_dialog_monthday_textsize">26sp</dimen>

</resources>

至此,MaterialCalendarDialog【Material样式的日历对话框】就可以使用了。

三、使用方法

建议搭配工具类——DateTimeHelper【日期类型与字符串互转以及日期对比相关操作】

package com.why.project.materialcalendarviewdialogdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;

import com.why.project.materialcalendarviewdialogdemo.dialog.materialcalendar.MaterialCalendarDialog;
import com.why.project.materialcalendarviewdialogdemo.utils.DateTimeHelper;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

/**
 * Create By HaiyuKing
 * Used 基于开源库material-calendarview 材料设计日历控件《https://github.com/prolificinteractive/material-calendarview》的使用Demo
 * 注意:建议搭配工具类——DateTimeHelper【日期类型与字符串互转以及日期对比相关操作】
 */
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private EditText edt_starttime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        initDatas();
        initEvents();
    }

    private void initViews() {
        edt_starttime = (EditText) findViewById(R.id.edt_starttime);

    }

    private void initDatas() {
    }

    private void initEvents() {

        //开始日期输入框的点击事件监听
        edt_starttime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Date todayDate = Calendar.getInstance().getTime();
                if(! TextUtils.isEmpty(edt_starttime.getText().toString())){
                    try {
                        todayDate = DateTimeHelper.parseStringToDate(edt_starttime.getText().toString());
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }

                //显示日历对话框
                MaterialCalendarDialog calendarDialog = MaterialCalendarDialog.getInstance(MainActivity.this,todayDate);
                calendarDialog.setOnOkClickLitener(new MaterialCalendarDialog.OnOkClickLitener() {
                    @Override
                    public void onOkClick(Date date) {
                        edt_starttime.setText(DateTimeHelper.formatToString(date,"yyyy-MM-dd"));
                    }
                });
                calendarDialog.show(getSupportFragmentManager(),TAG);
            }
        });
    }
}

混淆配置

参考资料

https://github.com/prolificinteractive/material-calendarview

最近开发的一款应用,我选择了哪些框架 & 第三方库

项目demo下载地址

https://github.com/haiyuKing/MaterialCalendarviewDialogDemo

时间: 2024-09-30 04:10:41

MaterialCalendarDialog【Material样式的日历对话框】的相关文章

Android用DialogFragment实现iphone样式的圆角对话框

Android实现iphone样式的对话框,主要是借助shape,corner元素方法. 下面的circular_corner_dialog.xml文件定义了一个圆角矩形.corner元素指定了圆角矩形的圆角半径,而gradient元素则指定了色彩渐变的方向以及起始颜色.当然也可以使用shape创建其它各种图形,如椭圆.线条以及环等,并设置不同的视觉风格. res/drawable/circular_corner_dialog.xml <?xml version="1.0" en

Android控件之CalendarView 日历对话框

在Android 3.0中新增的日历视图控件可以显示网格状的日历内容,android.widget.CalendarView是从android.widget.FrameLayout中继承. CalendarView 类提供了基本的日历设置方法, long getDate() 获取从1970年,1月1日,0点0分0秒到现在的毫秒数,因为返回是long型最终只能截止到2038年 int getFirstDayOfWeek() //获取当天是本周的第几天,Android123提示返回的定义在java.

拍照保存(调用手机),对话框的自定义样式

主页面布局文件很简单就是一个按钮弹出对话框,一个imageView显示选择的图片. 我给大家提供了下载代码在这个网页:http://download.csdn.net/download/u011348453/7669871 main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/r

SharePoint 2010 Pop-Up Dialogs SharePoint 2010 弹出对话框

SharePoint 2010 Pop-Up Dialogs SharePoint 2010 弹出对话框 SharePoint 2010 使得往你的网站添加对话框内容变得出乎意料的简单.内置的功能允许你从站点任何地方抽取内容,然后显示在模态对话框中,出现在页面的前端.当它涉及到现代Web技术的时候,这就是很标准的东东啦,但是易用性是真正使SharePoint对话框变得如此引人的主要原因.本文中,我们将探讨SharePoint 2010 平台带来的对话框功能,并且我们会发现自定义内容的新方法,来给

一个WP8样式的Android ProgressBar

一个WP8样式的进度对话框.对应Android转圈圈的ProgressBar.使用方法和普通的dialog一样 public class Win8ProgressDialog extends Dialog {     private WPLoading loading;     public Win8ProgressDialog(Context context) {         super(context);     }     public Win8ProgressDialog(Conte

重新想象 Windows 8.1 Store Apps (92) - 其他新特性: CoreDispatcher, 日历, 自定义锁屏系列图片

[源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之其他新特性 CoreDispatcher 的新特性 “日历”的相关操作 自定义锁屏时需要显示的系列图片 示例1.演示 CoreDispatcher 在 win8.1 中的新特性CoreDispatcherDemo.xaml.cs /* * 演示 CoreDispatcher 在 win8.1 中的新特性 * * 关于几个 Core 的基础请参见:http://www.cnblogs.com/weba

WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 日历控件Calendar自定义样式: 日期控件DatePicker自定义样式,及Label标签.水印.清除日期功能扩展: 二.Calendar自定义样式 先看看效果: 从上面图可以看出,日历的显示其实有三种状态,如下面的分解图: "日"部分的显示: "月"部分的显示: &qu

对话框(api)

对话框 壹佰软件开发小组  整理编译   如果有很多输入超出了菜单可以处理的程度,那么我们可以使用对话框来取得输入信息.程序写作者可以通过在某选项后面加上省略号(…)来表示该菜单项将启动一个对话框. 对话框的一般形式是包含多种子窗口控件的弹出式窗口,这些控件的大小和位置在程序资源描述文件的「对话框模板」中指定.虽然程序写作者能够「手工」定义对话框模板,但是现在通常是在Visual C++ Developer Studio中以交谈式操作的方式设计的,然后由Developer Studio建立对话框

Android-AlertDialog各种对话框的用法

目标效果:         程序运行,显示图一的几个按钮,点击按钮分别显示图二到图六的对话框,点击对话框的某一项或者按钮,也会显示相应的吐司输出. 1.activity_main.xml页面存放五个按钮. activity_main.xml页面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co