日期和时间对话框

对话框是人机交互的有力工具,Android自带了几个常用的对话框,包括AlertDialog提示对话框、ProgressDialog进度对话框、DatePickerDialog日期选择对话框、TimePickerDialog时间选择对话框等等。其中最常用的是AlertDialog,而且需要自定义对话框的时候,多半也是在AlertDialog.Builder基础上集成其他的控件,具体参见《 Android开发笔记(六十六)自定义对话框》。ProgressDialog也比较常用,在系统加载信息或者等待其他事情时,都可能需要显示ProgressDialog。相比之下,DatePickerDialog和TimePickerDialog用的不多,因为这两个对话框上的文字依赖于系统的语言设置,如果系统默认语言是英文,DatePickerDialog和TimePickerDialog上的文字也是英文,而且还无法设置为中文;另一个原因是这两个对话框的布局和风格无法自定义,如果想加上别的提示信息,就得自己重写代码了。接下来我们就使用AlertDialog来重写日期和时间对话框。

首先要提供日期对话框和时间对话框的布局文件,例如R.layout.dialog_format_date和R.layout.dialog_format_time,布局文件中需分别集成DatePicker和TimePicker控件。
然后分别初始化DatePicker和TimePicker对象,分别设置当前日期与当前时间。
接着创建一个AlertDialog.Builder对象,在该Builder对象中嵌入布局视图,并设置标题、确定按钮、取消按钮。
最后还要提供一个回调接口,用于主页面上处理日期和时间的选择事件,同时在确定按钮的点击事件中要触发该回调接口的方法。

下面是重写后的日期和时间对话框的代码

import java.util.Calendar;
import java.util.Date;import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TimePicker;import com.example.exmfiledialog.R;
import com.example.exmfiledialog.util.DateUtil;@SuppressLint("InflateParams")
public class CalendarDialog {private Context mContext;private CalendarCallbacks mCallbacks;public CalendarDialog(Context context) {mContext = context;}public interface CalendarCallbacks {public void onDateSelect(String date);public void onTimeSelect(String time);}public void setCallbacks(CalendarCallbacks callbacks) {mCallbacks = callbacks;}public void showDateDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(mContext);View view = ((Activity) mContext).getLayoutInflater().inflate(R.layout.dialog_format_date, null);final DatePicker datePicker = (DatePicker) view.findViewById(R.id.date_picker);Calendar calendar = Calendar.getInstance();// 初始化时间calendar.setTime(new Date());datePicker.init(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH), null);builder.setView(view);builder.setIcon(R.drawable.ic_about);builder.setTitle("设置日期信息");builder.setPositiveButton("确  定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {mCallbacks.onDateSelect(DateUtil.getDate(datePicker.getYear(), datePicker.getMonth()+1, datePicker.getDayOfMonth()));dialog.cancel();}});builder.setNegativeButton("取  消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.cancel();}});builder.create().show();}public void showTimeDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(mContext);View view = ((Activity) mContext).getLayoutInflater().inflate(R.layout.dialog_format_time, null);final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);Calendar calendar = Calendar.getInstance();calendar.setTime(new Date());timePicker.setIs24HourView(true);timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));builder.setView(view);builder.setIcon(R.drawable.ic_about);builder.setTitle("设置时间信息");builder.setPositiveButton("确  定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {mCallbacks.onTimeSelect(DateUtil.getTime(timePicker.getCurrentHour(), timePicker.getCurrentMinute()));dialog.cancel();}});builder.setNegativeButton("取  消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.cancel();}});builder.create().show();}}

下面是对话框的调用示例代码的关键片段

import com.example.exmfiledialog.widget.CalendarDialog;
import com.example.exmfiledialog.widget.CalendarDialog.CalendarCallbacks;public class MainActivity extends Activity implements OnClickListener, CalendarCallbacks {@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn_date) {CalendarDialog dialog = new CalendarDialog(this);dialog.setCallbacks(this);dialog.showDateDialog();} else if (v.getId() == R.id.btn_time) {CalendarDialog dialog = new CalendarDialog(this);dialog.setCallbacks(this);dialog.showTimeDialog();}}@Overridepublic void onDateSelect(String date) {Toast.makeText(this, "您选择的日期是:"+DateUtil.getDateCN(date), Toast.LENGTH_LONG).show();}@Overridepublic void onTimeSelect(String time) {Toast.makeText(this, "您选择的时间是:"+DateUtil.getTimeCN(time), Toast.LENGTH_LONG).show();}
}

信息确认对话框

虽说AlertDialog可用于自定义对话框,但其实只是它内部的Builder拿来集成,并且存在若干缺陷,如调用时要先手动设置回调接口,还无法管理生命周期等等。要想实现一个更加完善的对话框,需要在自定义对话框时继承DialogFragment类。下面用一个简单的提示对话框进行说明,该对话框主要是显示一段文字,然后由用户选择“确定”或者“取消”。

首先是ConfirmDialogFragment的初始化方法,这里采用Fragment类通用的newInstance函数。在newInstance中创建一个实例,并传入需要的参数信息,比如标题、内容等等字段。

其次在该实例加入到activity页面时(onAttach方法),设置回调接口,并从getArguments()中取出参数信息。

再次重写onCreateDialog方法,往对话框界面上添加具体的视图布局,这里的视图布局可从xml文件中获取,也可在代码中一个个添加。onCreateDialog方法后面当然要依例添加AlertDialog.Builder对象,依次设置标题、内容、图标、确定按钮、取消按钮等元素,其中确定按钮的点击事件需要调用回调接口的处理方法。

最后便是在主页面中调用自定义的提示对话框。

自定义提示对话框的代码如下:

import java.util.Map;import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;public class ConfirmDialogFragment extends DialogFragment {private static final String TAG = "ConfirmDialogFragment";private Map<String, Object> mMapParam;private ConfirmCallbacks mCallbacks;private LinearLayout mRoot;private int mIconId;private String mTitle;private String mMessage;public static ConfirmDialogFragment newInstance(int icon_id, String title, String message) {ConfirmDialogFragment frag = new ConfirmDialogFragment();Bundle args = new Bundle();args.putInt("icon_id", icon_id);args.putString("title", title);args.putString("message", message);frag.setArguments(args);return frag;}@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);if (!(activity instanceof ConfirmCallbacks)) {throw new IllegalStateException("Activity must implement fragment's callbacks.");}mCallbacks = (ConfirmCallbacks) activity;mIconId = getArguments().getInt("icon_id");mTitle = getArguments().getString("title");mMessage = getArguments().getString("message");}public void setParam(Map<String, Object> mapParam) {mMapParam = mapParam;}public interface ConfirmCallbacks {public void onConfirmSelect(Map<String, Object> map_param);}@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {LinearLayout.LayoutParams rootLayout = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT, 0.0F);mRoot = new LinearLayout(getActivity());mRoot.setOrientation(LinearLayout.VERTICAL);mRoot.setLayoutParams(rootLayout);Builder popupBuilder = new AlertDialog.Builder(getActivity());popupBuilder.setView(mRoot);if (mIconId > 0) {popupBuilder.setIcon(mIconId);}popupBuilder.setTitle(mTitle);popupBuilder.setMessage(mMessage);popupBuilder.setPositiveButton("确  定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {mCallbacks.onConfirmSelect(mMapParam);}});popupBuilder.setNegativeButton("取  消",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {}});return popupBuilder.create();}}

主页面的调用代码如下:

 private void showConfirmDialog() {ConfirmDialogFragment fsf = ConfirmDialogFragment.newInstance(R.drawable.ic_about, "吃货来了", "您是否想吃海鲜大餐?");Map<String, Object> map_param = new HashMap<String, Object>();map_param.put("address", "台北");fsf.setParam(map_param);fsf.show(getFragmentManager(), "");}

文件打开和文件保存对话框

文件对话框是比较复杂的对话框,主流app很少会在应用中直接让用户操作文件,不过对码农来说,文件对话框又是非常常见的,而且一些专业的app也少不了文件处理,所以实际开发中还是能用到文件对话框。

文件对话框与上面的提示对话框一样,也是从DialogFragment类继承而来,主要步骤与ConfirmDialogFragment大同小异,其主要难点在于文件和文件夹的处理。另外,文件(夹)列表需要用ListView来展示,所以得补充ListView必须的适配器与监听器,适配器ArrayAdapter用于展示文件和文件夹列表,监听器用于响应文件项的点击事件。

当然不要忘了在主页面的回调方法中对选定文件做具体处理,文件打开之后要如何读取数据,又要如何把内存中的数据保存到文件中。

下面是文件打开对话框与文件保存对话框的页面截图:
          

点击下载本文用到的五种自定义对话框的工程代码

点此查看Android开发笔记的完整目录

Android开发笔记(二十三)文件对话框FileDialog相关推荐

  1. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模 五 粒子系统模拟 二

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  2. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7607916 作者:毛星云    邮箱: h ...

  3. Android开发笔记(十三)视图绘制的几个方法

    三个可进行绘制的方法 在自定义视图中,有三个函数可以重写用于界面绘制,在视图创建过程中,三个函数的执行顺序依次是:onLayout.onDraw.dispatchDraw. 1.onLayout(bo ...

  4. android开发笔记之mk文件

    注释 # ------------------------------------------------------------- # START # ----------------------- ...

  5. Andriod开发之二十:Android开发笔记(序)写在前面的目录

    https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...

  6. Android开发笔记(序)写在前面的目录

    知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入 ...

  7. Android开发笔记(序)

    本开发笔记,借鉴与其他开发者整理的文章范例与心得体会.在这里作为开发过程中的一个总结与笔记式记录. 如有侵犯作者权益,请及时联系告知删除.俗话说:集百家成一言,去粕成金. ************** ...

  8. Android开发笔记(序)写在前面的目录大全

    转自  湖前琴亭 的博客https://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面 ...

  9. Android开发笔记(九十九)圆形转盘

    圆形转盘的实现思想 圆形转盘的运用场景常见的有:抽奖转盘.圆形菜单列表.热点客户端环状列表等等.对于圆形转盘的编码实现,主要难点除了手势的触摸控制之外,就在于旋转角度的计算了.下面是旋转角度计算的解决 ...

  10. Android开发笔记(九十五)自定义Drawable

    Drawable Bitmap是Android对图像的定义描述,而Drawable则是对图像的展现描述,在View视图中显示图像都是通过Drawable来实现的.其中有关Bitmap的介绍参见< ...

最新文章

  1. 最小长度电路板排列问题_射频电路板设计,这篇文章五大总结不可忽视!
  2. [SDOI2008]Sandy的卡片
  3. 践行“健康中国”战略-李忠:谋定功能性原生态农业大健康
  4. Ubuntu 14.04 DNS 配置
  5. apache多站点配置+多端口配置
  6. Bzoj1051 受欢迎的牛
  7. ubuntu 编译 /usr/bin/ld: cannot find 问题解决
  8. mysql exp 注入_使用exp进行SQL报错注入
  9. C# 图书管理系统(MySQL)——代码(四)
  10. 编写一个JSP页面,利用Scriptlet编写一段计算代码,要求用0做除数,并使用page指令将该错误信息显示在另一个JSP页面上,产生的错误信息为“错误,不能用0做除数.“
  11. 2022网易校招易计划在线课程
  12. linux查看ip命令
  13. Python学习必看书籍_带你高效学习
  14. AMR文件格式的解释
  15. 小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布)
  16. m3云服务器_“中国球迷”索尼A7RM3及镜头下的情况肖像
  17. matplotlib之pyplot模块之饼图(pie():基础参数,返回值)
  18. 猜数字游戏(小游戏编码)
  19. CSS语义-icont+text
  20. Linux查看流量情况以及关闭流量端口

热门文章

  1. 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。...
  2. Spring 的狭义与广义
  3. Java自动化测试框架-06 - 来给你的测试报告化个妆整个形 - (下)(详细教程)
  4. catia怎么将特征参数化_CATIA参数化建模及关系式的创建和使用 | 坐倚北风
  5. 观察者模式java类图_初探Java设计模式------观察者模式
  6. 电脑控制手机屏幕软件_手机屏幕如何投屏到电脑
  7. JavaScript 字符串截取方法汇总
  8. 最快学习之Vue Route
  9. scala调用java库_从scala调用java时的java.lang.IllegalAccessError – solutions / workarounds?...
  10. java rtree源码_rtree R树用java实现的源代码,欢迎广大用户学习交流 Applet 272万源代码下载- www.pudn.com...