0.  前言

DialogFragment是在Android3.0(API level 11)中引入,代替了已经不建议使用的AlertDialog。

为什么不再建议使用AlertDialog了呢?我们先得清楚DialogFragment存在的意义。本文原创,转载请注明出处为SEU_Calvin的博客

(1)DialogFragment和Fragment基本一致的生命周期,因此当旋转屏幕和按下后退键时便于Activity更好的管理其生命周期。

(2)比如当屏幕旋转时,AlertDialog会消失,更不会保存如EditText上的文字,如果处理不当很可能引发异常,因为Activity销毁前不允许对话框未关闭。而DialogFragment对话框会随之自动调整对话框大小。DialogFragment的出现完美的解决了横竖屏幕切换Dialog消失的问题,同时也有恢复数据的功能。

1.  AlertDialog的使用

这种方式是我以前使用的,既然不建议使用,那就尽量少用吧。但是感觉比DialogFragment要简单一些。代码直接在Activity中就能完成。下面是一个让用户输入密码的对话框例子。

 private AlertDialog dialog;
private void showEnterDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
View view = View.inflate(MainActivity.this, R.layout.fragment_login_dialog, null);
ok = (Button) view.findViewById(R.id.ok);
cancel = (Button) view.findViewById(R.id.cancel);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//取出密码并验证的逻辑略
dialog.dismiss();
}
});
dialog = builder.create();
dialog.setView(view, 0, 0, 0, 0);
dialog.show();
}

效果如下所示,看起来还不错,但是旋转屏幕后对话框就消失了。针对这个问题,还是建议使用DialogFragment来做对话框。

2.  DialogFragment的使用——继承DialogFragment并实现onCreateDialog

DialogFragment有两种使用方式,第一种是写一个类继承DialogFragment并且实现它的onCreateDialog方法来创建一个DialogFragment,在onCreateDialog中一般使用AlertDialog创建并返回一个对话框。

public class AlertDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
//这里使用的布局文件和1中的一样,只是去掉了两个按钮
View view = inflater.inflate(R.layout.fragment_login_dialog, null);
builder.setView(view).setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {}
}).setNegativeButton("Cancel", null);
return builder.create();
}
}

接下来就是在Activity中使用它:

FragmentTransaction mFragTransaction = getFragmentManager().beginTransaction();
Fragment fragment = getFragmentManager().findFragmentByTag("dialogFragment");
if(fragment!=null){
//为了不重复显示dialog,在显示对话框之前移除正在显示的对话框
mFragTransaction.remove(fragment);
}
AlertDialogFragment dialogFragment = new AlertDialogFragment();
//显示一个Fragment并且给该Fragment添加一个Tag,可通过findFragmentByTag找到该Fragment
dialogFragment.show(mFragTransaction, "dialogFragment");

效果如下所示,还是不错的,旋转屏幕后对话框也不会消失,如果有文字也会被保存:

3.  DialogFragment的使用——继承DialogFragment并实现它的onCreateView

DialogFragment的第二种使用方式是继承DialogFragment并且实现它的onCreateView方法来加载一个我们指定的xml布局从而提供对话框内容。这里需要注意的是如果没有调用下面的第四行代码,加载出来的对话框会默认出现一个标题,查看DialogFragment的源码可以发现它内部是mDialog.setContentView(view);即把我们的xml布局加载到Dialog的Content内容区域。或许你不想去除标题,反而想要在标题区域显示你设置的标题,那么可以使用getDialog().setTitle("这是标题");。本文原创,转载请注明出处为SEU_Calvin的博客

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//去掉默认的标题
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View view = inflater.inflate(R.layout.fragment_login_dialog, container);
ok = (Button) view.findViewById(R.id.ok);
cancel = (Button) view.findViewById(R.id.cancel);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialog().dismiss();
}
});
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialog().dismiss();
}
});
return view;
}

在Activity中的简易使用如下,效果和1中的是一样的。但是屏幕的旋转丝毫不会影响到对话框。

AlertDialogFragment alertDialogFragment = new AlertDialogFragment();
alertDialogFragment.show(getFragmentManager(), "EditNameDialog");

4.  使用接口回调实现DialogFragment和Activity的通信

以第一种实现它的onCreateDialog方法为例,只需定一个如下的接口,并在点击OK的逻辑中,回调接口的方法传入获取用户输入,即可在实现了该接口的Activity中得到这些数据。

public interface LoginInputListener  {
void onLoginIn (String password);
}
LoginInputListener listener = (LoginInputListener) getActivity();
listener. onLoginIn (mPassword.getText().toString());
//在Activity中
@Override
public void onLoginIn (String password) {
//得到数据password
}

至此关于使用Fragment创建对话框的介绍就到此结束了。

请大家多点赞支持一下~

Android开发——官方推荐使用DialogFragment替换AlertDialog的更多相关文章

  1. Android官方推荐使用DialogFragment替换AlertDialog

    DialogFragment是在Android3.0(API level 11)中引入的,它代替了已经不建议使用的AlertDialog. DialogFragment高效地封装和管理对话框的生命周期 ...

  2. Android开发书籍推荐:从入门到精通系列学习路线书籍介绍

    Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 很多时候我们都会不断收到新手的提问"Android开发的经典入门教材和学习路线?"."Android 开发入 ...

  3. (转)Android开发书籍推荐:从入门到精通系列学习路线书籍介绍

    Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 转自:http://blog.csdn.net/findsafety/article/details/52317506 很多时候我们都会不 ...

  4. Android开发书籍推荐

    当你看到这些文字时,那么恭喜你,你可能选择了一个无限可能的方向. Android,Google出品,信誉保证,你值得深入研究. 学习一样新事物或许有多种方式,报培训班,看视频,向高手请教等等,但一本好 ...

  5. Android开发资源推荐第2季

    Android CPU监控想法,思路,核心技术和代码 Android App /Task/Stack 总体分析 http://www.eoeandroid.com/thread-161703-1-1. ...

  6. Android 开发工具推荐

    简评: 自己过去在 Android 开发中发现的好工具,在这里分享给大家.: ) Library methods count 每一个 Android App 的开发中都会用到很多的库,这个工具能够让你 ...

  7. android 开发 实现一个自定义布局的AlertDialog对话框

    对话框有很多实现方法,最常见的是在一个点击事件中代码直接写出对话框.如下: package com.example.lenovo.mydemo2; import android.content.Dia ...

  8. Android开发——异步任务中Activity销毁时的问题

    0.  前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...

  9. Android各层推荐开发书籍及参考资料

    Android各层推荐开发书籍及参考资料 转自:http://blog.csdn.net/fancylovejava/article/details/8657058 Android系统按照架构来说一共 ...

随机推荐

  1. Android Studio支持Java1.8的解决方案

    Java1.8新添了一些特性,比如对lambda表达式的支持,父类推断等等,这篇文章讲述了1.8的新特性,有兴趣的同学可以点进去看看.但是由于AndroidStudio并不能直接支持Java1.8,我 ...

  2. tinymce4.x 上传本地图片(自己写个插件)

    tinymce是一款挺不错的html文本编辑器.但是添加图片是直接添加链接,不能直接选择本地图片. 下面我写了一个插件用于直接上传本地图片. 在tinymce的plugins目录下新建一个upload ...

  3. Python+Selenium笔记(三):使用unittest

    #网络很慢可能会运行报错 (一)   前言 Selenium WebDriver是一个浏览器自动化测试的API集合.它提供了很多与浏览器自动化交互的特性,并且这些API主要是用于测试Web程序.如果仅 ...

  4. (Stanford CS224d) Deep Learning and NLP课程笔记(二):word2vec

    本节课将开始学习Deep NLP的基础--词向量模型. 背景 word vector是一种在计算机中表达word meaning的方式.在Webster词典中,关于meaning有三种定义: the ...

  5. 留言板0.4_model中的数据库(1)

    1.先在数据库中加入一天测试数据先 2.在model的"views"中载入数据库和model的类 import pymysql from .models import UserMe ...

  6. 正则捕获url的?号传值

    http://www.baidu.com/Q?k=0012719021908563998510650 有时候,我们需要在静态页面捕获?号传值,这时就需要用到js的正则表达式. 例如:我们要获取上面这个 ...

  7. MySQL之UNDO及MVCC、崩溃恢复

      UNDO特性:避免脏读.事务回滚.非阻塞读.MVCC.崩溃恢复 事务工作流程(图2) MVCC原理机制 崩溃恢复:redo前滚.undo回滚 长事务.大事务:危害.判断.处理 UNDO优化:实现u ...

  8. Mariadb配置Galera集群

    一.增加MariaDB源 cd /etc/yum.repos.d vi MariaDB.repo # MariaDB 10.1 CentOS repository list - created 201 ...

  9. linux 设备驱动加载的先后顺序

    Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. 1.初始化宏 Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  10. 【转】Java学习---解析Java Servlet工作过程

    [原文]https://www.toutiao.com/i6594316694657696264/ 解析Java Servlet工作过程 Servlet简介 Servlet是sun公司提供的一门用于开 ...