• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 详细解读DialogFragment,解读dialogfragment

详细解读DialogFragment,解读dialogfragment

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了dialogfragment,dialogfragment样式,dialogfragment全屏,dialogfragment.show,dialogfragment使用等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

详细解读DialogFragment,解读dialogfragment


原博客地址:http://www.cnblogs.com/tianzhijiexian/p/4161811.html

相信看这篇文章的人都应该知道android中的Dialog了吧,如果对于Dialog还不是很了解可以看我之前的一篇详解文章:

Dialog详解:http://www.cnblogs.com/tianzhijiexian/p/3867731.html

随着Fragment这个类的引 入,Google官方推荐大家使用DialogFragment来代替传统的Dialog,那么是不是说我们之前学习的Dialog知识都没有用处了呢? 非也,新的fragment是来方便大家更好的管理和重用Dialog,之前的知识其实都是可以拿来就用的,仅仅需要少许的改变。

 

一、Dialog和DialogFragment的区别和优劣

新来的DialogFragment让dialog也变成了碎片,相比之前来说应该做了很多优化和处理,对于程序员来看对话框现在更加具体了,就是一个activity上的一个fragment,我们也可以用fragment的知识来管理对话框了。

我们看看之前是怎么运用对话框对象的

复制代码
  AlertDialog dialog = new AlertDialog.Builder(this)
        .setTitle("Dialog")
        .setMessage("thisis a dialog")
        .show();
复制代码

如果这个时候屏幕方向发生变化,就会导致Activity重建,然后之前显示的对话框就不见了。查看log可以发现这个错误:

04-1917:30:06.999: E/WindowManager(14495): Activitycom.example.androidtest.MainActivity has leaked windowcom.android.internal.policy.impl.PhoneWindow$DecorView{42ca3c18 V.E.....R....... 0,0-1026,414} that was originally added here

当然我们也可以无视这个错误,因为程序不会因此崩溃(看来android本身就已经预料到这种情况了)。

如果我们想要在旋转屏幕的时候也能保证这个对话框显示就需要做一定的处理了,在activity要销毁前设立一个标志,看这时对话框是否是显示状态,如果是那么activity在下次建立时直接显示对话框。

在onSaveInstanceState中

复制代码
@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (dialog != null && dialog.isShowing()) {
            outState.putBoolean("DIALOG_SHOWN", true);
        }
    }
复制代码

在onCreat中

复制代码
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        
        if (savedInstanceState != null) {
            boolean isShown = savedInstanceState.getBoolean("DIALOG_SHOWN");
            if (isShown) {
                AlertDialog dialog = new AlertDialog.Builder(this).setTitle("Dialog")
                        .setMessage("thisis a dialog").show();
            }
        }
    ……
}
复制代码

使用DialogFragment来管理对话框 就不会有这种问题了,代码也少了很多的逻辑处理。当你旋转屏幕的时候,fragmentManager会自定管理DialogFragment的生命周 期,如果当前已经显示在屏幕上了,那么旋转屏幕后夜会自动显示,下面就是在屏幕旋转时的log输出。

4-1917:45:41.289: D/==========(16156): MyDialogFragment : onAttach

04-1917:45:41.299: D/==========(16156): MyDialogFragment : onCreate

04-1917:45:41.299: D/==========(16156): MyDialogFragment : onCreateView

04-1917:45:41.309: D/==========(16156): MyDialogFragment : onStart

04-1917:45:50.619: D/==========(16156): MyDialogFragment : onStop

04-1917:45:50.619: D/==========(16156): third activity on destroy

04-1917:45:50.619:D/==========(16156): MyDialogFragment : onDestroyView

04-1917:45:50.619: D/==========(16156): MyDialogFragment : onDetach

04-1917:45:50.639: D/==========(16156): MyDialogFragment : onAttach

04-1917:45:50.639: D/==========(16156): MyDialogFragment : onCreate

04-1917:45:50.659: D/==========(16156): MyDialogFragment : onCreateView

04-1917:45:50.659: D/==========(16156): MyDialogFragment : onStart

Ok,当然你可以不以为然,你说我的应用就是竖着用的,旋转屏幕毕竟是小概率事件,谁会开着对话框旋转来旋转去啊。那么相信下面的好处你一定不能否定吧。

我们之前用Dialog的时候,在activity中必须要建立这个对象,而且一般我们都是需要给它放监听器的,比如下面的代码:

复制代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.guid_main);new AlertDialog.Builder(GuideActivity.this).setTitle("用户申明")
        .setMessage(getResources().getString(R.string.statement))
        .setPositiveButton("我同意", new positiveListener())
        .setNegativeButton("不同意", new negativeListener())
        .setCancelable(false)
        .show();
    }private class positiveListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            prefs.setIsFirstTime(false);
        }
    }
    
    private class negativeListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Util.virtualHome(GuideActivity.this);
        }
    }
复制代码

 

你会发现这么长的代码很破坏activity中 的逻辑性,有木有!!!在activity中我们处理的各种控件的显示和逻辑,但对于dialog这种不属于activity并且建立和处理逻辑都自成一 体的东西,我们为什么要在activity中建立呢?而且为了方便重用,我们在实际过程中基本都会建立一个dialog的工具类来做处理,所以为什么不用 DialogFragment来实现呢?如果通过它来实现,我们就能很方便的进行管理对话框。

此外,当 旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。且DialogFragment也允许开发者把 Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。有可能我们在大屏幕上就不需要弹出一个对话框了, 直接内嵌在activity界面中

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详细解读DialogFragment,解读dialogfragment
  • Android 官方推荐 : DialogFragment 怎样创建对话框

相关文章

  • 2017-05-26Smack+OpenFire搭建IM通信,包含心跳和自动重连(Android实现),smackopenfire
  • 2017-05-26我的第一节Android课,第一节Android课
  • 2017-05-26基于android-async-http的android服务,android-async-http
  • 2017-05-26Git版本控制工具(一)----git的安装及创建版本库,git----git
  • 2017-05-26Java多线程常见问题,java多线程
  • 2017-05-26android:常用的AlertDialog对话框及自定义对话框
  • 2017-05-26android开发之路01,android之路01
  • 2017-05-26浅谈Kotlin(一):简介及Android Studio中配置,kotlinandroid
  • 2017-05-26Android程序版本更新--通知栏更新下载安装,android程序版本
  • 2017-05-26Android Drawable的9种子类 介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 关于 android canvas 的简单总结
    • Android新手入门2016(6)--客户端编程思想的初步思考和Android学习路线
    • [Android] Activity间切换,传递数据,androidactivity
    • 从零开始怎么写android native service?
    • 接入微信分享过程的喜和泪
    • 错误提示”void is an invalid type for the variable“,invalidvariable
    • 从视频中每X秒创建一个缩略图
    • MySQL rpl_semi_sync_master_timeout相关的一件BUG
    • Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单
    • Socket for android 简单实例,socketandroid

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有