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. 利用ListView批量删除item

    利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...

  2. 8.什么是模块,模块的导入,__name__

    相关内容: 什么是模块 模块的导入 模块的导入 自模块的导入 同级目录导入 不同级目录导入 目录内导入目录外 目录外导入目录内 __name__ 首发时间:2018-02-04 15:23 修改: 2 ...

  3. 【转】python version 2.7 required,which was not found in the registry

    源地址:http://www.cnblogs.com/thinksasa/archive/2013/08/26/3283695.html 方法:新建一个register.py 文件,把一下代码贴进去, ...

  4. 用 React 整合 LogEntries JavaScript 库

    [编者按]本文作者为 David Posin,主要介绍 React 与 LogEntries 间的相互操作.本文系国内 ITOM 管理平台 OneAPM 编译呈现. 众所周知,React.js已经被证 ...

  5. VS2010/2013 运行是很卡的加速方案

    前段时间为了一个项目而把VS2008换成了VS2010,结果原本就不堪重负的本本跑起VS2010来那更是慢得没话说,于是看了遍VS2010选项,又从网上到处找资料找优化方法,总算使我的VS2010跑得 ...

  6. MySQL: Building the best INDEX for a given SELECT

    Table of Contents The ProblemAlgorithmDigressionFirst, some examplesAlgorithm, Step 1 (WHERE "c ...

  7. FTP 命令的使用

    最近需要使用 ftp 工具,所以借此机会来进行整理以下具体的内容: 具体什么是ftp, ftp 能干什么? 请参考: https://access.redhat.com/documentation/e ...

  8. MySQL基础之 如何删除主键

    我们在一个表中设置了主键之后,那么如何删除主键呢? 删除主键的语法是: ALTER TABLE TABLE_NAME DROP PRIMARY KEY; 在这里我们要考虑两种情况: 1.可以直接使用d ...

  9. 1.4环境的准备(四)之Pycharm的使用技巧

    返回总目录 目录: 1.快捷键的使用: 2.提示技巧: 3.其他技巧: (一)快捷键的使用: (1)Pycharm自带默认的快捷键 1.Ctrl + C 复制 2.Ctrl + V 粘贴 3.Ctrl ...

  10. 正确计算linux系统内存使用率

    参考:https://blog.gesha.net/archives/406/ 图中的例子很典型,就是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或 ...