Aandroid日历Dialog

Dialog效果图:




我们一步一步来实现上面的效果


第一步:先实现如上图的效果

分析

1.要有一个操作日期的工具类(Utils)  此类主要功能  当前日期月份的最大天数 日期月份的1号数星期几?  日期的上一个月最大天数

  2. 通过Utils 获取 lastDates contentDates nextDates 三个日期数据集合

3. 创建GridView实例 显示 lastDates contentDates nextDates 三个日期数据集合

GridViewAdapter 源码如下:

public class DateGridViewAdapter extends BaseAdapter {

	public static final String MONDAY = "周一";
	public static final String TUESDAY = "周二";
	public static final String WEDNESDAY = "周三";
	public static final String THURSDAY = "周四";
	public static final String FRIDAY = "周五";
	public static final String SATURDAY = "周六";
	public static final String SUNDAY = "周日";
	private Context context;

	private String date;// 日期字符串 日期格式:yyyy-MM-dd

	private int MAXday;// 日期月份一共有多少天

	private int TopMAXday;// 日期月份上一个月一共有多少天

	private int ItemCount = 42;// GridView Item个数

	
	private ArrayList<String> lastDates;// 当前日期月份之前一个月
	private ArrayList<String> contenDates;// 当前日期月份
	private ArrayList<String> nextDates;// 当前日期月份之后一个月

	/**
	 * @param date
	 *            当传递过来的date为null时 则使用当前时间
	 * @param remindDate
	 *            所需要提醒的时间集合
	 * 
	 */
	public DateGridViewAdapter(Context context, String date) {
		this.context = context;
		if (date == null) {
			this.date = Utils.getDate();
		} else if (Utils.isValidDate(date)) {
			this.date = date;
		}
		initialization();
	}
	/**
	 * 初始化日期数据
	 */
	private void initialization() {
		MAXday = Utils.getDayOfMonth(getDate());
		TopMAXday = Utils.getTopDayOfMonth(getDate());
		setData();		
	}
	/**
	 * 设置日期数据
	 */
	private void setData() {
		 contenDates = new ArrayList<>();
		 nextDates = new ArrayList<>();
		lastDates = new ArrayList<>();
		switch (Utils.getWeek(this.date)) {
		case MONDAY: // 周一
			addData(lastDates, TopMAXday, TopMAXday);
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday - 1);
			break;
		case TUESDAY: // 周二
			addData(lastDates, TopMAXday - 1, TopMAXday);
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday - 2);
			break;
		case WEDNESDAY:// 周三
			addData(lastDates, TopMAXday - 2, TopMAXday);
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday - 3);
			break;
		case THURSDAY:// 周四
			addData(lastDates, TopMAXday - 3, TopMAXday);
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday - 4);
			break;
		case FRIDAY:// 周五
			addData(lastDates, TopMAXday - 4, TopMAXday);
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday - 5);
			break;
		case SATURDAY:// 周六
			addData(lastDates, TopMAXday - 5, TopMAXday);
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday - 6);
			break;
		case SUNDAY:// 周日
			addData(contenDates, MAXday);
			addData(nextDates, ItemCount - MAXday);
			break;
		}
	}

	private void addData(ArrayList<String> list, int i, int count) {
		for (int j = i; j <= count; j++) {
			list.add(j + "");
		}
	}

	private void addData(ArrayList<String> list, int count) {
		for (int i = 1; i <= count; i++) {
			list.add(i + "");
		}
	}

	@Override
	public int getCount() {
		return contenDates.size() + nextDates.size() + lastDates.size();
	}

	@Override
	public Object getItem(int position) {
		if (lastDates.size() != 0 && position < lastDates.size()) {
			return lastDates.get(position);
		} else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {

			return nextDates.get(position);
		} else {
			return contenDates.get(position);
		}
	}
	@Override
	public long getItemId(int position) {
		return position;
	}
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		TextView tv = null;
		if (convertView == null) {
			AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
					Utils.dip2px(context, 40));
			tv = new TextView(context);
			tv.setLayoutParams(lp);
			convertView = tv;
		} else {
			tv = (TextView) convertView;
		}	
		// 上一个月
		if (lastDates.size() != 0 && position < lastDates.size()) {
			tv.setTextColor(Color.parseColor("#bfbfbf"));
			tv.setText(lastDates.get(position));
		}
		// 下一个月
		else if (nextDates.size() != 0 && position > lastDates.size() + contenDates.size() - 1) {			
			tv.setText(nextDates.get(position - lastDates.size() - contenDates.size()));
			tv.setTextColor(Color.parseColor("#bfbfbf"));
		}
		// 当月
		else {
				tv.setText(contenDates.get(position - lastDates.size()));
				tv.setTextColor(Color.parseColor("#000000"));
		}
		return tv;
	}
}


Utils 源码:

public class Utils {
	public static final int TYPR_NEXT = 0;// 下一个月

	public static final int TYPR_LAST = 1;// 上一个月

	/**
	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
	 */
	public static int px2dip(Context context, float pxValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (pxValue / scale + 0.5f);
	}

	/**
	 * 根据手机的分辨率从 dp(像素) 的单位 转成为 px
	 */
	public static int dip2px(Context context, float dpValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}
	
	/**
	 * @param date
	 *            日期字符串 传入的日期字符串格式 :"年-月-日"
	 * @return 返回日期月份的1号是星期几?
	 */
	public static String getWeek(String date) {
		Calendar calendar = Calendar.getInstance(Locale.CHINA);
		calendar.setTime(new Date(getMillisecond(date)));
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		SimpleDateFormat format = new SimpleDateFormat("E");
		return format.format(calendar.getTime());

	}

	/**
	 * @return 返回系统当前时间的日期字符串 "年-月-日"
	 */
	public static String getDate() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		return df.format(new Date());
	}
	/**
	 * @param date
	 *            根据传入日期字符串 date 传入的日期字符串格式 :"年-月-日"
	 * 
	 * @param type
	 *            {@link #TYPR_LAST }上一个月
	 *            <p>
	 *            {@link #TYPR_NEXT}下一个月
	 * 
	 * @return 返回下一月或上一个月的日期字符串
	 */
	public static String getNewDate(String date, int type) {
		String formatDate = getDate(getMillisecond(date));

		String year = formatDate.substring(0, 4);
		String day = formatDate.substring(8, formatDate.length());
		String month = formatDate.substring(5, 7);

		int intYear = Integer.valueOf(year);
		int intMonth = Integer.valueOf(month);
		month = "";
		if (type == TYPR_LAST) {
			if (intMonth > 1) {
				month = String.valueOf((intMonth - 1));
			} else {
				year = "";
				month = "12";
				year = String.valueOf((intYear - 1));
			}
		} else {
			if (intMonth == 12) {
				year = "";
				month = "1";
				year = String.valueOf((intYear + 1));
			} else {
				month = String.valueOf((intMonth + 1));
			}
		}
		String NewDate = year + "-" + month + "-" + day;
		return getDate(getMillisecond(NewDate));
	}

	/**
	 * @param date
	 *            日期字符串 传入的日期字符串格式 :"年-月-日"
	 * @return 返回日期上一个月 月份的最大天数
	 *
	 * 
	 */
	public static int getTopDayOfMonth(String date) {
		String NewDate = getNewDate(date, TYPR_LAST);
		return getDayOfMonth(NewDate);
	}

	/**
	 * @param date
	 *            日期字符串 传入的日期字符串格式 :"年-月-日"
	 * @return 返回日期月份的最大天数
	 */
	public static int getDayOfMonth(String date) {

		Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
		aCalendar.setTime(new Date(getMillisecond(date)));
		int day = aCalendar.getActualMaximum(Calendar.DATE);
		return day;
	}

	/**
	 * @param date
	 *            日期字符串 传入的日期字符串格式 :"年-月-日"
	 * @return 返回日期的毫秒值
	 */
	public static long getMillisecond(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date d = null;
		try {
			d = sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return d.getTime();
	}

	/**
	 * @param millisecond
	 *            毫秒值
	 * @return 返回一个日期格式为 yyyy-MM-dd 的字符串 "年-月-日"
	 */
	public static String getDate(Long millisecond) {
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(millisecond);

		return formatter.format(calendar.getTime());
	}

	/**
	 * @param date
	 *            判断日期格式是否是 yyyy-MM-dd "年-月-日"
	 * @return 如果不是则返回 fase
	 */
	public static boolean isValidDate(String date) {
		boolean convertSuccess = true;
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try {
			// 设置lenient为false.
			// 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
			format.setLenient(false);
			format.parse(date);
		} catch (ParseException e) {
			// e.printStackTrace();
			// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
			convertSuccess = false;
		}
		return convertSuccess;
	}

}
到此初始效果已经实现了 .....................

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android全局Dialog是一种可以在应用程序的任何界面中显示的对话框。它可以覆盖在当前界面上方,并且不会阻止用户与其他部分进行交互。可以使用全局Dialog来显示一些重要的信息、警告、确认对话框等。 要创建一个全局Dialog,可以使用AndroidDialog类。首先,需要在应用程序的主题中设置一个全局样式,该样式将应用于所有的Dialog。可以在styles.xml文件中定义这个样式,例如: ```xml <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 全局Dialog样式 --> <item name="android:dialogTheme">@style/CustomDialogTheme</item> </style> <style name="CustomDialogTheme" parent="Theme.AppCompat.Dialog"> <!-- 自定义全局Dialog样式 --> <item name="android:windowIsFloating">true</item> <!-- 其他自定义属性 --> </style> ``` 然后,在代码中创建Dialog实例并显示出来。可以在任何需要显示全局Dialog的地方调用以下代码: ```java Dialog dialog = new Dialog(context, R.style.CustomDialogTheme); dialog.setContentView(R.layout.dialog_layout); // 设置其他Dialog属性和内容 dialog.show(); ``` 这里的`R.layout.dialog_layout`是自定义的对话框布局文件,可以根据需要进行修改。 需要注意的是,全局Dialog并不是一种推荐的UI设计方式,因为它可能会打断用户的操作流程,并且可能会给用户带来困扰。在使用全局Dialog时,应该谨慎考虑,并确保它的使用是合理的,不会对用户体验造成负面影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值