前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发笔记(二十三)文件对话框FileDialog

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

作者头像
aqi00
发布2019-01-18 11:08:34
3.2K0
发布2019-01-18 11:08:34
举报

日期和时间对话框

对话框是人机交互的有力工具,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() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						mCallbacks.onDateSelect(DateUtil.getDate(
								datePicker.getYear(), 
								datePicker.getMonth()+1, 
								datePicker.getDayOfMonth()));
						dialog.cancel();
					}
				});
		builder.setNegativeButton("取  消",
				new DialogInterface.OnClickListener() {
					@Override
					public 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() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						mCallbacks.onTimeSelect(DateUtil.getTime(
								timePicker.getCurrentHour(), 
								timePicker.getCurrentMinute()));
						dialog.cancel();
					}
				});
		builder.setNegativeButton("取  消",
				new DialogInterface.OnClickListener() {
					@Override
					public 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 {


	@Override
	public 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();
		}
	}
	
	@Override
	public void onDateSelect(String date) {
		Toast.makeText(this, "您选择的日期是:"+DateUtil.getDateCN(date), Toast.LENGTH_LONG).show();
	}


	@Override
	public 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;
	}

	@Override
	public 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);
	}

	@Override
	public 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开发笔记的完整目录

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年12月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 日期和时间对话框
  • 信息确认对话框
  • 文件打开和文件保存对话框
相关产品与服务
腾讯云小微
腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档