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. Flutter开发中的几个常用函数

    几个Flutter开发中的常用函数 /** 返回当前时间戳 */ static int currentTimeMillis() { return new DateTime.now().millisec ...

  2. 如何在单元测试时隔离ORM

    在项目中需要对DAL层进行单元测试,如果直接操作数据库,首先测试速度会大大下降,而且让单元测试直接使用外部依赖,很可能带来后续维护的不便,所以有必要对数据库隔离,然后单独测试DAL层.由于使用了ORM ...

  3. MySQL——索引优化实战

    上篇文章中介绍了索引的基本内容,这篇文章我们继续介绍索引优化实战.在介绍索引优化实战之前,首先要介绍两个与索引相关的重要概念,这两个概念对于索引优化至关重要. 本篇文章用于测试的user表结构: 索引 ...

  4. Oracle EBS AP 供应商API

    --创建供应商地址上的电话号码 created by jenrry 20170419 DECLARE l_return_status VARCHAR2(1); l_msg_count NUMBER; ...

  5. 转:在ASP.NET MVC中通过URL路由实现对多语言的支持

    对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎 ...

  6. Linux 补丁生成与使用

    我们在升级Linux 内核的时候,难免会接触到补丁的知识.下面对如何生成补丁和如何打补丁作讲解. 生成补丁: 制作 hello.c 和 hello_new.c 两个文件如如下所示. ➜ diff ls ...

  7. 过滤掉URL中的参数部分

    //将超链接的参数部分滤掉 ?xxx if(url.contains("?")){ url=url.substring(0,url.indexOf("?")); ...

  8. maven的下载与安装

    下载路径:http://maven.apache.org/download.cgi 选择打红线的进行下载,我用的版本是3.3.9, 下载后解压该文件,解压后的文件内容如下: 解压完成后配置maven的 ...

  9. css3自定义滚动条背景透明

    .editor{ overflow:hidden; height:640px; padding:0 45px; border: 0 none; outline: none; } .editor::-w ...

  10. 最好用的jquery列表拖动排列(由项目提取)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wuchengzeng/article/details/31766235 最好的jquery列表拖动排 ...