文档章节

Android中Dialog与DialogFragment的对比

风荷举
 风荷举
发布于 2013/11/26 21:39
字数 782
阅读 27213
收藏 17

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

最近学习对话框时发现有两种类型的可供使用,一种是Dialog,另一种则是Android 3.0 引入的基于Fragment的DialogFragment。

从代码的编写角度看,Dialog使用起来要更为简单,但是Google则是推荐尽量使用DialogFragment(对于Android 3.0以下的版本,可以结合使用support包中提供的DialogFragment以及FragmentActivity)。今天试着用这两种方式来创建对话框,发现DialogFragment果然有一个非常好的特性(在手机配置变化,导致Activity需要重新创建时,例如旋屏,基于DialogFragment的对话框将会由FragmentManager自动重建,然而基于Dialog实现的对话框则没有这样的能力)。

下面是两段实例代码:

他们使用的界面都一样:(dialog.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

1.基于Dialog实现的对话框

public class MainActivity extends Activity {
	private Button clk;
	private Dialog dialog;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		clk = (Button) findViewById(R.id.clk);
		dialog = new Dialog(this);
		dialog.setContentView(R.layout.dialog);
		clk.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				dialog.show();
			}
		});
	}
}



当我们点击按钮时,会弹出对话框(内容为android logo),当我们旋转屏幕后,Activity重新创建,整个Activity的界面没有问题,而对话框消失了。

除此之外,其实还有一个问题,就是在logcat中会看到异常信息:Android..leaked .. window,这是因为在Activity结束之前,Android要求所有的Dialog必须要关闭。我们旋屏后,Activity会被重建,而上面的代码逻辑并没有考虑到对话框的状态以及是否已关闭。

于是将上述代码修改为:

public class MainActivity extends Activity {
	private Button clk;
	private Dialog dialog;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		clk = (Button) findViewById(R.id.clk);
		dialog = new Dialog(this);
		dialog.setContentView(R.layout.dialog);
		clk.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				dialog.show();
			}
		});

		//用户恢复对话框的状态
		if(savedInstanceState != null && savedInstanceState.getBoolean("dialog_show"))
			clk.performClick();
	}

	/**
	 * 用于保存对话框的状态以便恢复
	 */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		if(dialog != null && dialog.isShowing())
			outState.putBoolean("dialog_show", true);
		else
			outState.putBoolean("dialog_show", false);
	}

	/**
	 * 在Activity销毁之前,确保对话框以关闭
	 */
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(dialog != null && dialog.isShowing())
			dialog.dismiss();
	}
}



2. 基于DialogFragment的对话框

与上面的对话框使用同样的界面布局,此处仅仅展现一个简单对话框,因此只重写了onCreateView方法

public class MyDialogFragment extends DialogFragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.dialog, container, false);
		return v;
	}
}



public class MainActivity extends FragmentActivity {
	private Button clk;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		clk = (Button) findViewById(R.id.clk);
		clk.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				MyDialogFragment mdf = new MyDialogFragment();
				FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
				ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
				mdf.show(ft, "df");
			}
		});
	}
}



这两段代码可以实现第一种方式的同样功能,此处我们并没有去关心对话框的重建,以及Activity销毁前对话框是否已关闭,这一切都是由FragmentManager来管理。

其实DialogFragment还拥有fragment的优点,即可以在一个Activity内部实现回退(因为FragmentManager会管理一个回退栈)


关于Fragment的常见问题,可以参见: Android Fragment 常见问题及解决方案


© 著作权归作者所有

风荷举
粉丝 11
博文 24
码字总数 24803
作品 0
朝阳
程序员
私信 提问
加载中

评论(1)

TracyZhang
TracyZhang
写的不错,赞
Activity与DialogFragment交互的方法

今天我们来讨论一下如何在Activity与DialogFragment交互的方法,这里包括了DialogFragment的启动以及Activity方法的调用。 DialogFragment与Dialog相比类似,是官方现在更建议使用的Dialog。...

萧文翰
01/28
0
0
Android进阶——Android弹窗组件工作机制之Dialog、DialogFragment

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30379689/article/details/86597623 前言 Android在DialogFragment推出后,就已经不推荐继续使用Dialog,可...

Hensen_
01/22
0
0
如何使用DialogFragment类来创建和显示对话框

本示例演示如何使用DialogFragment类来显示和管理一个AlertDialog对话框。代码在Android3.0中编译测试通过。 1. 定义清单文件(AndroidManifest.xml) 2. 定义资源文件(strings.xml和bools...

长平狐
2012/10/16
2.5K
0
support.v4.app.DialogFragment使用问题总结

因app需求问题,需要实现如图这种dialog 看到这里,你可能会说如此easy的事情,还说什么! 那么继续往下看! 场景1: import android.app.Dialog;import android.content.DialogInterface;i...

artshell
2015/06/11
3.8K
0
DialogFragment 不可取消和点击外部不消失

在最近的项目开发中需要通过短信验证码登录,实现中需要用到DialogFragment来实现验证码输入框,具体效果如下图: TIM图片20170921105551.jpg 但是在具体使用过程中可能不小心触碰到透明背景...

shzwork
09/26
7
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 我的视频网站vip账号和我厚脸皮的朋友们

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Cobbage :分享小海的单曲《衡山路(2016现场版)》: 《衡山路(2016现场版)》- 小海 手机党少年们想听歌,请使劲儿戳(这里) @FalconChe...

小小编辑
今天
6
0
Spring Cloud Alibaba 实战(十二) - Nacos配置管理

> 本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理的意义 项目...

JavaEdge
今天
9
0
面试官问你编码相关的面试题,把这篇甩给他就完事!

前情回顾:Java中一个字符占两字节 但为什么new String("字").getBytes().length 返回3个字节 今天主要聊一聊: 字节 字符 字符集 编码 字符编码 Java 内码和外码 Unicode 字节 例如 :00001...

gzc426
今天
10
0
写的简单sh脚本2

#!/bin/bashexport LANG="en_US.UTF-8"#chmod +x filename 记得给文件加可执行权限#./vsimstart.sh#启动vsim项目echo "start vism"#207------------------------------assets=vsim-a......

hexiaoming123
昨天
7
0
java基础(1)变量和常量

概要和总结: 数据类型图: 基本数据类型:只有基本功能-----保存数据 (4类8种)byte-short-int-long-float-double-char-boolean 引用数据类型:有更多功能,保存数据,处理数据...

煌sir
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部