【转】 Pro Android学习笔记(四五):Dialog(2):DialogFragment
DialogFragment的实例newInstance()已经在上一次学习笔记中实现。我们创建dialog的UI,可以通过重写DialogFragment的两个函数当中的一个来实现,这两个函数是onCreateView()和onCreateDialog(),前者返回view,后者返回dialog,如同通过AlertDialog.Builder构造一样。
重写onCreateView()
重写onCreateView()是fragment的传统方式,适合自定义的对话框,本例适合用于提示框,如下图所示。通过按菜单弹出提示框,提示框由一个TextView,一个EditText和三个Button组成UI。按不同的按钮触发不同的处理。小例子自作范例,按Save和Dismiss按钮,都会调用Activity的onDialogDone()函数,根据用户的实际操作,显示不同的信息。按Help按钮,则弹出一个帮助框。再弹框在稍后学习笔记中实现。
通过onCreateView()设置UI和按键反馈
利用Fragment的onCreateView()来实现对话框的UI和Fragment学习中没有差别,在本例中,我们增加了按钮点击的触发,代码如下:
public class PromptDialogFragment extends DialogFragment implements OnClickListener{
public static PromptDialogFragment newInstance(String prompt){
...略...
}
@Override //通过重写Fragment的onCreateView()实现dialog的UI
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//1、通过inflate,根据layout XML定义,创建view
View v = inflater.inflate(R.layout.prompt_dialog, container,false);
TextView tv = (TextView)v.findViewById(R.id.prompt_message);
tv.setText(getPrompt());
//2、注册三个button的按键监听listener
Button dismissBtn = (Button)v.findViewById(R.id.button_dismiss);
dismissBtn.setOnClickListener(this);
Button saveBtn = (Button)v.findViewById(R.id.button_save);
saveBtn.setOnClickListener(this);
Button helpBtn = (Button)v.findViewById(R.id.button_help);
helpBtn.setOnClickListener(this);
return v;
}
private String getPrompt(){
Bundle b = getArguments();
return b.getString("prompt-message");
}
@Override //在onCreate中设置对话框的风格、属性等
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果setCancelable()中参数为true,若点击dialog覆盖不到的activity的空白或者按返回键,则进行cancel,状态检测依次onCancel()和onDismiss()。如参数为false,则按空白处或返回键无反应。缺省为true
setCancelable(true);
//可以设置dialog的显示风格,如style为STYLE_NO_TITLE,将被显示title。遗憾的是,我没有在DialogFragment中找到设置title内容的方法。theme为0,表示由系统选择合适的theme。
int style = DialogFragment.STYLE_NO_NORMAL, theme = 0;
setStyle(style,theme);
}
@Override //仅用于状态跟踪
public void onCancel(DialogInterface dialog) {
showInfo("onCancel() is called");
super.onCancel(dialog);
}
@Override //仅用户状态跟踪
public void onDismiss(DialogInterface dialog) {
showInfo("onDismiss() is called");
super.onDismiss(dialog);
}
@Override //Button按键触发的回调函数
public void onClick(View v) {
MainActivity act = (MainActivity)getActivity();
switch(v.getId()){
case R.id.button_dismiss:
act.onDialogDone(getTag(), true, null); //调用activity的onDialogDone(),通过Toast显示相关信息
dismiss(); //关闭对话框,并触发onDismiss()回调函数。
break;
case R.id.button_help:
… 略:以后实现 …
break;
case R.id.button_save:
TextView tv = (TextView)getView().findViewById(R.id.input_text);
act.onDialogDone(getTag(), false, "[save]" + tv.getText()); //调用activity的onDialogDone(),通过Toast显示相关信息
dismiss(); //关闭对话框,并触发onDismiss()回调函数
break;
default:
break;
}
}
private void showInfo(String s){
Log.d("PromptDialogFragment",s);
}
}
信息保存
如果用户在输入框中填入text,然后进行屏幕的横屏和竖屏切换,这涉及到填入内容的保存,可以通过onSaveInstanceState(),将之保存到fragment的Bundle savedInstanceState中,并在onCreateView()中将之恢复。但是在Android 4.2版本的测试中,系统已经能够自动保存和恢复,无需加入代码。当然,安全地我们仍建议进行以下处理。
public class PromptDialogFragment extends DialogFragment implements OnClickListener{
private EditText et = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
......
et = (EditText)v.findViewById(R.id.input_text);
if(savedInstanceState != null){
CharSequence text = savedInstanceState.getCharSequence("input");
et.setText(text == null ? "" : text);
}
......
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putCharSequence("input", et.getText());
super.onSaveInstanceState(outState);
}
}
重写onCreateDialog()
对于简单的对话框,可以通过AlterDialog.Builder直接创建对话框的UI,本例用于告警框,如下图。AlertDialog.Builder在Android 3.0版本之前的创建对话框方式,在之后的版本中,可用在DialogFragment中,适用于创建简单对话框。
代码如下。虽然都是OnClickListener接口,但提示框的是View.OnClickListener,这里是DialogInterface.OnClickListener。
public class AlterDialogFragment extends DialogFragment implements DialogInterface.OnClickListener{
/*【步骤1】:通过newInstance()创建实例并返回* */
public static AlterDialogFragment newInstance(String title,String message){
… 略 …
}
private String getTitle(){
return getArguments().getString("alert-title");
}
private String getMessage(){
return getArguments().getString("alert-message");
}
/* 【步骤2】创建view可以通过两个途径,一是fragment中的onCreateView(),二是DialogFragment中的onCreateDialog()。
* 前者适合对自定义的layout进行设置,具有更大的灵活性
* 而后者适合对简单dialog进行处理,可以利用Dialog.Builder直接返回Dialog对象
* 从生命周期的顺序而言,先执行onCreateDialog(),后执行oonCreateView(),我们不应同时使用两者。
* */
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder b = new AlertDialog.Builder(getActivity())
.setTitle(getTitle())
.setMessage(getMessage())
.setPositiveButton("OK", this) //设置回调函数
.setNegativeButton("Cancel",this); //设置回调函数
return b.create();
}
@Override //按键触发的回调函数
public void onClick(DialogInterface dialog, int which) {
boolean isCancel = false;
if(which == AlertDialog.BUTTON_NEGATIVE){ //判断用户所按何键
isCancel = true;
}
MyActivity act = (MyActivity) getActivity();
act.onDialogDone(getTag(), isCancel, "CLick OK, Alert dismissed");
}
}
本博文涉及的例子代码,可以在Pro Android学习:Dialog小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(四五):Dialog(2):DialogFragment的更多相关文章
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
随机推荐
- php生成条形码: barcodegen
实例结构: 1. index.html <!DOCTYPE html> <html> <head> <title>Test with embedded ...
- ElasticSearch(二十)定位不合法的搜索及其原因
GET /test_index/test_type/_validate/query?explain { "query": { "math": { "t ...
- 【模式识别】CART和GML AdaBoost MATLAB TOOLBOX
GML AdaBoost Matlab Toolbox是一款很优秀的AdaBoost工具箱,内部实现了Real AdaBoost, Gentle AdaBoost和Modest AdaBoost三种方 ...
- 函数创建XML文件
REPORT YTST_XML_14. *----------------------------------------------------------------------* * PANT ...
- MySQL一些常见查询方式
1.查询端口号命令: show global variables like 'port'; 2.查看版本号: select version(); 3.查看默认安装的MySQL的字符集 show var ...
- 深入理解利用new创建对象的执行过程以Person p=new Person("张三",20);为例
代码如下: class Person { private String name="haha"; private int age; private static String co ...
- DEV开发之界面皮肤
最终效果:正文本人的环境是 VS2013+DEV 13.21.第一步,新建项目,(忽略)???2.修改Form1.cs的基类,Form修改为DevExpress.XtraBars.Ribbon.Rib ...
- Array对象(一)
Array是JavaScript中的一个事先定义好的对象(也可以称作一个类),可以直接使用. 创建Array对象: var array = new Array(); 创建指定元素个数的Array对象: ...
- Myeclipse或者Eclipse恢复默认启动时显示选择workspace的问题
[问题描述] 不知道是不是Myeclipse8.5的Bug,我最近安装了8.5之后,前面几天打开MyEclipse的时候都是让我自己选择工作空间的,但是最近突然每次打开的时候都自己打开了C盘下面工作空 ...
- vmware在桥接模式下配置centos7网络
首先要将Vmware10.0.3设置为桥接模式. CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd /etc/sysconfig/network-scripts/ #进入网络配置 ...