安卓日历
插件效果如图所示:
使用:
引入:在build.gradle中添加 implementation 'com.prolificinteractive:material-calendarview:1.4.0';
应用:
(1)所在的activity要
implements CalFragment.OnFrgDataListener
(2)
CalFragment calendarViewFragment= new CalFragment();
calendarViewFragment.show(getSupportFragmentManager(), "timeChoose");
(3)重写CalFragment
public class CalFragment extends DialogFragment implements OnDateSelectedListener {
DialogFragment mcontext = this;
int flag = 0;
private View view;
MaterialCalendarView mcv;
//接收从Activity传来的数据
Bundle timeBundle;
OnFrgDataListener IListener;
public CalFragment() {
// required empty public constructor
}
@SuppressLint("validFragment")
public CalFragment(int flag) {
this.flag = flag;
}
@Override
public View onCreateView(layoutInflater inflater, ViewGroup container,
Bundle savedinstanceState) {
view = inflater.inflate(R.layout.fragment_cal, container, false);
mcv = view.findViewById(R.id.mcv);
timeBundle = getarguments();
initData();
return view;
}
@Override
public void onStart() {
super.onStart();
//下面这些都是为了让dialog宽度全充满
Window win = getDialog().getWindow();
// 一定要设置Background,如果不设置,window属性设置无效
win.setBackgrounddrawable(new colorDrawable(getresources().getColor(R.color.white)));
displayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
WindowManager.layoutparams params = win.getAttributes();
// 使用ViewGroup.LayoutParams,以便Dialog 宽度充满整个屏幕
params.width = ViewGroup.LayoutParams.MATCH_parent;
params.height = ViewGroup.LayoutParams.wrap_content;
win.setAttributes(params);
/*if (dialog != null) {
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
dialog.getWindow().setLayout((int) (dm.widthPixels * 1), ViewGroup.LayoutParams.WRAP_CONTENT);
}*/
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这个主题 背景全透明 没有半透明
// setStyle(DialogFragment.STYLE_NO_FRAME, Android.R.style.Theme_Holo_Light);
}
public void initData() {
// 显示兴起补全的整个礼拜的上个月或者下个月的日期 一般会多出一行整个礼拜
// 点击补全出来的另外一个月的信息 可以直接跳到那个月
mcv.setShowOtherDates(MaterialCalendarView.SHOW_ALL);
// 设置日历默认的时间为当前的时间
mcv.setSelectedDate(new Date());
if(flag == 1 ){
Calendar c = Calendar.getInstance();
/*取得系统日期:*/
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// 日历的主要设置
mcv.state().edit()
// 设置你的日历 第一天是周一还是周一
.setFirstDayOfWeek(Calendar.MONDAY)
// 设置你的日历的最小的月份 月份为你设置的最小月份的下个月 比如 你设置最小为1月 其实你只能滑到2月
/*.setMinimumDate(CalendarDay.from(2015, 1, 1))*/
// 同最小 设置最大
.setMaximumDate(CalendarDay.from(year, month, day))
// 设置你的日历的模式 是按月 还是按周
.setCalendarDisplayMode(CalendarMode.MONTHS)
.commit();
} else {
// 日历的主要设置
mcv.state().edit()
// 设置你的日历 第一天是周一还是周一
.setFirstDayOfWeek(Calendar.MONDAY)
// 设置你的日历的最小的月份 月份为你设置的最小月份的下个月 比如 你设置最小为1月 其实你只能滑到2月
/*.setMinimumDate(CalendarDay.from(2015, 1, 1))*/
// 设置你的日历的模式 是按月 还是按周
.setCalendarDisplayMode(CalendarMode.MONTHS)
.commit();
}
// 设置你选中日期的背景底色
mcv.setSelectionColor(getResources().getColor(R.color.blueBackOfBtn));
mcv.setOnDateChangedListener(this);
}
/**
* 日期选择 回调函数
*
* @param widget
* @param date
* @param selected
*/
@Override
public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) {
toast.maketext(getActivity(), getSelectedDatesString(), Toast.LENGTH_SHORT).show();
// Toast.makeText(getActivity(),"从Activity传递的数据:"+(String)timeBundle.get("date"),Toast.LENGTH_SHORT).show();
IListener.progress(mcv.getSelectedDate().getDate());
//选择后,延迟消失
new handler().postDelayed(new Runnable() {
@Override
public void run() {
mContext.dismiss();
}
}, 1000);
}
/**
* 将日期转换为字符串
*
* @return
*/
private String getSelectedDatesString() {
CalendarDay date = mcv.getSelectedDate();
if (date == null) {
return "No Selection";
}
Log.i("sinstar", "getSelectedDatesString: " + date.toString());
return formatter.format(date.getDate());
}
private static final DateFormat FORMATTER = simpledateformat.getDateInstance();
/**
* 定义接口,向Activity传递数据
*/
public interface OnFrgDataListener {
public void progress(Date date);
}
/**
* 注入实例方法
*
* @param
*/
/* public void setOnFrgDataListener(OnFrgDataListener listener){
IListener=listener;
}*/
@Override
public void onattach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnFrgDataListener) {
IListener = (OnFrgDataListener) activity;
} else {
throw new illegalargumentException("activity must implements OnFrgDataListener");
}
}
@Override
public void onDetach() {
super.onDetach();
IListener = null;
}
}
(4)设置日历的最大时间// 同最小 设置最大
.setMaximumDate(CalendarDay.from(year, month, day))
(5)date即为所选时间
@Override
public void progress(Date date) {
//每次选择日期后,都会调用这个方法
if (date != null) {
str = ParseDate.dateParseString(date);
query_1.setText(str);
}
}
相关阅读
2018年元旦节日过了,农历春节也离我们不远了,过年是我们每个中国人一年中最重要的一个节日,做为离家打拼的游子每年最关心也是回家过
日历是一项深入我们生活的设计,最早的日历是什么样的?它的设计经历了哪些改变?本文将会带领大家一起探索日历的演化进程。我们被那些
造物节是阿里打造的一个大型IP,并且是一个空前盛大的线下活动。今年造物节将在杭州西湖展开,一共200家淘宝神店,还有6大集市。大家好
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="
春运临近,火车票成为众网友回家的“思念票”。记者从中国铁路公司获悉,随着2019年春节的临近,2019春运火车票于12月23日提前发售。此