对话框的任何一个按钮,只要点击,默认状态下均会关闭对话框。对话框的关闭是由AlertDialog.mShowing这个变量控制的,只要在单击按钮的过程中修改这个变量的值就可以了。
try{
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
//将mShowing变量设置 为false,好让系统认为这个dialog已经关闭
field.set(dialog,false);
}catch (Exception e){}
改变对话框的透明度
WindowManager.LayoutParams lp=dialog.getWindow().getAttributes();
lp.alpha=1.0f;
dialog.getWindow().setAttributes(lp);
alpha在0.0f到1.0f之间。1.0完全不透明,0.0f完全透明
设置黑暗度
dialog.setContentView(R.layout.dialog);
WindowManager.LayoutParams lp=dialog.getWindow().getAttributes();
lp.dimAmount=1.0f;
dialog.getWindow().setAttributes(lp);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dimAmount在0.0f和1.0f之间,0.0f完全不暗,1.0f全暗
还有个FLAG用途设置背景模糊,dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
改变对话框的位置
苹果用技术改变了整个世界。苹果的产品iPhone和iPad改变了人们对数字设备的看法。
苹果已经成为世界上最大的公司。2011年,苹果公司市值5080亿美元。苹果产品的销售额达到了1280亿。苹果还在日益增长。请看下图:
需求:在做类似于微博的android客户端的时候,要求有个定时发微薄功能,时间设置要求:初始化时间大于当前时间两分钟,设置时间不能超过十五天。
解决过程:在网上找了一部分参考资料,发现都不能很好的解决问题,查看了时间的API也没有真正明白用法,据听说java中最让人费解的就是时间处理这块。后来在一个同事的帮助下,找到了思路。
首先:创建一个类继承 OnDateChangedListener OnTimeChangedListener
在代码中初始化时间和日期控件,这里用的是DatePicker和TimePicker
Calendar c = Calendar.getInstance(); sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); // 加上这行代码就哦了 oldTimeString = sdf.format(c.getTime()); //如果不初始化则不会对dataPicker进行监听 datePicker.init(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), this); //设置时间大于当前时间两分钟 timePicker.setCurrentHour(c.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(c.get(Calendar.MINUTE) + 2); onDateChanged(null, 0, 0, 0); //通知修改时间为初始化的时间
这样处理就可以实现初始化时间大于当前时间两分钟,而且实现的是24小时制的模式。
然后就是自己在页面里进行时间的设置,通过监听来实现时时的显示时间信息:
@Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { System.out.println("你点击了月份"); Calendar calendar = Calendar.getInstance(); calendar.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), timePicker.getCurrentHour(), timePicker.getCurrentMinute()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); setTimeString = sdf.format(calendar.getTime()); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); sdf2.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); textView.setText( sdf2.format(calendar.getTime()) ); } @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { onDateChanged(null, 0, 0, 0); }
在点击确定的时候,对设置的时间进行最后的判断,主要是判断时间是否大于15天的问题。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); try { /** * 提前两分钟 */ setTimeDate = df.parse(setTimeString); c1.setTime(setTimeDate); c1.add(Calendar.MINUTE, 2); setTimeDate = c1.getTime(); Date d2 = df.parse(oldTimeString); /** * 提前15天零两分钟 */ c2.setTime(d2); c2.add(Calendar.DAY_OF_MONTH, 15); c2.add(Calendar.MINUTE, 2); Date oldTimeDate = c2.getTime(); /** * setTimeDate设置时间 * oldTimeDate当前时间 + 十五天零两分钟 * oldTimeDate - setTimeDate > 0 说明设置时间小于十五天 * = 0 说明设置时间等于15天 * < 0 说明设置时间大于15天 */ diff = oldTimeDate.getTime() - setTimeDate.getTime() ; } catch (Exception e) { System.out.println("e=" + e); }
这种加减时间的方式才是正确的,现实的时候不会出现时间错乱的问题。
通过对diff的比较大小就可以达到了时间不能超过十五天的目的。
/** * diff属于毫秒的差值 如果小于零说明设置时间大于15天 自动把时间调整到第十五天 * 如果大于大于15 * 1000 * 24 * 60 * 60 + 2 * 60 * 1000 说明设置时间小于当前时间 则自动把时间设置到当前时间 * 这里又考虑到有两分钟的差值 */ if (diff > 0) { if (diff <= (15 * 1000 * 24 * 60 * 60 + 2 * 60 * 1000)) { Intent intent = new Intent(SetTimes.this, SendMicoBlog.class); Bundle bundle = new Bundle(); /* * new一个Bundle对象,并将要传递的数据传入 */ bundle.putInt("hour", timePicker.getCurrentHour()); bundle.putInt("minute", timePicker.getCurrentMinute()); bundle.putInt("year", datePicker.getYear()); bundle.putInt("month", datePicker.getMonth() + 1); bundle.putInt("date", datePicker.getDayOfMonth()); bundle.putLong("diff", setTimeDate.getTime()); System.out.println(datePicker.getMonth() + "month"); intent.putExtras(bundle); setResult(3, intent); SetTimes.this.finish(); } else { Calendar c3 = Calendar.getInstance(); datePicker.init(c3.get(Calendar.YEAR), c3.get(Calendar.MONTH), c3.get(Calendar.DAY_OF_MONTH), SetTimes.this); timePicker.setCurrentHour(c3.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(c3.get(Calendar.MINUTE) + 2); Toast.makeText(SetTimes.this, "设置时间应该大于零", Toast.LENGTH_SHORT).show(); } } else { datePicker.init(c2.get(Calendar.YEAR), c2.get(Calendar.MONTH), c2.get(Calendar.DAY_OF_MONTH), SetTimes.this); timePicker.setCurrentHour(c2.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(c2.get(Calendar.MINUTE) - 3); Toast.makeText(SetTimes.this, "设置时间应该小于等于15天", Toast.LENGTH_SHORT).show(); } onDateChanged(null, 0, 0, 0);
在时间不满足的情况下,做了两个处理,第一:如果小于当前时间则把时间调整到当前时间加两分钟;第二:如果设置时间大于15天,则把时间调整到第十五天的时间。最终问题最终得到解决