`

DialogFragment 来实现Dialog的封装

 
阅读更多

转于:http://blog.csdn.net/flowingflying/article/details/13503389

 

Pro Android学习笔记(四四):Dialog(1):触发Dialog

---------------------------------------------------------------------------------------------------------------

 

Android提供alert、prompt、pick-list,单选、多选,progress、time-picker和date-picker对话框,并提供自定义的dialog。在Android 3.0后,dialog基于fragment,并对之前版本提供兼容支持库,也就是说对于开发者而言,dialog是基于DialogFragment的,但此时需要在应用中加入相关的兼容库。

和Windows或者网页JS的Dialog不同,Android的dialog是异步的,而不是同步的。对于同步的dialog,显示dialog后,下一行代码会等到dialog结束,即下一行代码可以知道dialog的输入以及用户点击的button。而对于异步的dialog,dialog显示后,下一行代码继续执行,而不是等dialog消失,通过callback来处理dialog的事件。异步的dialog也意味着应用的代码也可以关闭dialog。

我们的小例子通过菜单触发分别触发告警框和自定义布局提示框,提示框中有三个button,其中一个Help按钮可以再触发一个帮助内容的对话框。

创建dialog fragment

对话框基于DialogFrame,告警框AlterDialogFrament类如下,如何通过newInstance()创建实例在Fragment的学习中已经学过,不再详述。newInstance()有两个参数,一是告警框的标题,一是告警框的内容。

public class AlterDialogFragment extends DialogFragment{    
   /*【步骤1】:通过newInstance()创建实例,并返回,这里的处理和系统从save状态中re-create相同。
    * 1、通过缺省构造函数创建对象 
    * 2、将传递的信息设置为fragment的参数 
    * 3、返回对象 
    * */
 
    public static AlterDialogFragment newInstance(String title,String message){ 
        AlterDialogFragment adf = new AlterDialogFragment(); 
        Bundle bundle = new Bundle(); 
        bundle.putString("alert-title", title); 
        bundle.putString("alert-message", message); 
        adf.setArguments(bundle); 
        return adf; 
    } 
   ...... 略,见后文......  
}

自定义布局提示框PromptDialogFragment同样是DialogFragment的继承。类似的,代码如下:

public class PromptDialogFragment extends DialogFragment

    public static PromptDialogFragment newInstance(String prompt){ 
        PromptDialogFragment pdf = new PromptDialogFragment(); 
        Bundle b = new Bundle(); 
        b.putString("prompt-message", prompt); 
        pdf.setArguments(b); 
        return pdf; 
    } 
    ......略,见后文...... 

Activity显示对话框

在MyActivity中,通过optionsMenu来分别触发告警框和提示框的显示,代码如下:

public class MainActivity extends Activity{ 
    //设置告警框、提示框和帮助框的dialog fragment的tag。 
    public final static String ALERT_DIALOG_TAG = "ALERT_DIALOG_TAG";
    public final static String PROMPT_DIALOG_TAG = "PROMPT_DIALOG_TAG"; 
    public final static String HELP_DIALOG_TAG = "HELP_DIALOG_TAG";
 
    
    …... 略 : 设置UI和创建OptionsMenu ...... 
   
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) {  
        switch(item.getItemId()){ 
        case R.id.alter_dialog:            
            alterDialogTestCase(); 
            break; 
        case R.id.prompt_dialog: 
            promptDialogTestCase(); 
        default: 
            break; 
        } 
        return false; 
    }  
   
   /* 触发告警框:通过dialogFragment.show()触发 
    * 我们注意对于FragmentTransaction ft,代码中没有执行ft.commit()。查看DialogFragment的show方法的源代码,如下

              public void show(FragmentManager manager, String tag){
                    mDismissed = false; 
                    mShownByMe = true; 
                    FragmentTransaction ft = manager.beginTransaction(); 
                    ft.add(this, tag); 
                    ft.commit();
 
                } 
                public int show(FragmentTransaction transaction, String tag) {
                    mDismissed = false; 
                    mShownByMe = true; 
                    transaction.add(this, tag); 
                    mViewDestroyed = false; 
                    mBackStackId = transaction.commit();
                    return mBackStackId; 
                }
  
    * 这里面的操作含有ft.add()和ft.commit(),故不需要在代码中重复commit,否则会异常。 add表示加入到activity,这里没有填容器的ID,即contianerViewID为0,表示不加载在具体容器内,对于dialog,container为null。
    * 这本例中也可以通过adf.show(getFragmentManager(), ALERT_DIALOG_TAG)来实现。对于将fragment transaction作为参数的方式,在调用show()之前,可通过fragment transaction进行控制,如加入到back stack中,这将在按提示框的Help按钮弹帮助框中进行演示。在show()中,同时设置了fragment的tag,可用于索引,可在fragment中可以通过getTag()获取。 */

    private void alterDialogTestCase(){  
        AlterDialogFragment adf = AlterDialogFragment.newInstance("Alert", "This is the Alter Message for test!");
        FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        adf.show(ft, ALERT_DIALOG_TAG); 
    } 
    /* 弹出提示框 */ 
    private void promptDialogTestCase(){  
        PromptDialogFragment pdf = PromptDialogFragment.newInstance("This is a Prompt Dialog!");
        FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        pdf.show(ft, PROMPT_DIALOG_TAG); 
    } 
    
    /* 此为用户按对话框按键时被调用的方法,通过Toast显示相关信息。*/ 
    public void onDialogDone(String tag, boolean cancelled, CharSequence message) {
        String s = tag + " responds with: " + message; 
        if(cancelled) 
            s = tag + " was cancelled by the user"; 
        //Toast是没有button的信息框,在一定时间后消失,很适合用于debug。
        Toast.makeText(this, s, Toast.LENGTH_LONG).show();  
    } 

}

通过fragment实现dialog的好处是:activity配置改变(例如转向)进行重构的情况下,fragment管理器能够自动重够,恢复原来的状态,无需人工干预。

本博文涉及的例子代码,可以在Pro Android学习:Dialog小例子中下载。

相关链接: 我的Android开发相关文章

分享到:
评论

相关推荐

    dialog 封装DialogFragment来实现的, 通用dialog

    本篇将详细介绍如何封装`DialogFragment`来创建一个通用的、可复用的`Dialog`组件,以及如何实现底部弹框和分享弹框。 首先,我们需要创建一个新的`DialogFragment`子类,例如`NiceDialog`。这个类应该包含以下核心...

    封装一个通用Dialog,使用DialogFragment

    本教程将详细介绍如何封装一个通用的Dialog,使用DialogFragment。 1. **DialogFragment简介** DialogFragment是Fragment的子类,它具有Fragment的所有特性,如生命周期管理、回退栈支持等。同时,它还能展示一个...

    安卓 通用BaseDialogFragment 封装

    对DialogFragment进行通用封装,运用了注解和反射的知识,还有BaseAdapter封装,详情可看https://blog.csdn.net/qq_38812658/article/details/88935054

    基于DialogFragment封装,实现圆角对话框、进度条、列表框、输入框的Android UI设计源码

    该源码包封装了基于DialogFragment的Android UI设计,实现圆角对话框、进度条、列表框、输入框等功能,风格仿效iOS设计,支持横竖屏切换。包含128个HTML文件、98个Java源文件、58个PNG图片文件、29个XML布局文件、5...

    Android代码-基于DialogFragment封装的库,丰富的属性,帮助你化繁为简。

    A library based on Google's recommended DialogFragment package, according to its own business extraction package, the library is written using kotlin, java can also be called, can meet most project ...

    【自定义Dialog】封装IOS样式的Dialog--Android Studio

    可以使用诸如`CardView`或自定义形状来实现圆角,使用`TextView`和`Button`等组件来构建交互界面。 接下来,我们需要创建一个自定义Dialog类。这个类通常会继承自`AppCompatDialogFragment`,因为DialogFragment能...

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    通常,我们需要继承`AlertDialog.Builder`或`DialogFragment`,然后自定义Dialog的内容和行为。在UI线程中调用`show()`方法来显示Dialog,确保不违反Android的UI更新规则——所有的UI操作必须在主线程中进行。然而,...

    Android 自定义dialog

    本文将深入探讨如何在Android中实现自定义Dialog,包括封装点击事件、设置对话框文案、添加弹出动画以及调整Dialog的位置。 首先,创建自定义Dialog通常需要继承`AlertDialog.Builder`或`DialogFragment`。`...

    android 自己封装自己所需的Dialog对话框

    本文将深入探讨如何在Android中封装自己的Dialog对话框,以便在多个地方复用并保持代码的整洁性。 首先,我们需要了解Dialog的基本概念。Dialog是Android中的一个视图组件,它浮现在应用程序窗口之上,用于向用户...

    dialogFragment弹窗处理器,背景模糊处理

    对dialogFragment进行封装,包装。并对弹窗进行统一管理。包含弹窗的c++语言的背景模糊调用,dialog消亡后,内存的快速回收,提高效率。统一处理dissmiss事件。方便复杂的dialog功能需求。 调用方式 application中 ...

    android底部弹出Dialog

    此外,可以使用`DialogFragment`的`setStyle()`方法来调整Dialog的宽度,例如使其充满整个屏幕。 当需要显示Dialog时,只需在Activity或Fragment中实例化这个自定义DialogFragment,并调用`show()`方法即可: ```...

    各种Dialog集锦

    在Android中,我们可以通过自定义布局和DialogFragment来实现这样的效果,确保布局的样式、颜色以及动画效果与iOS保持一致。 其次,`自定义对话框`是Android开发中的常见需求。开发者可以根据应用的需求创建具有...

    自定义dialog及其他工具类库

    总结来说,这个自定义dialog及其他工具类库提供了丰富的功能,包括但不限于自定义Dialog的实现、多版本兼容性处理以及相机功能的封装。开发者可以利用这个库快速实现对话框的定制,同时享受到其他工具类带来的便利,...

    dialog + recycleVIew

    在给定的标题"dialog + recycleVIew"中,我们看到它们被结合起来使用,这意味着我们可能在实现一个自定义的`Dialog`,其中包含了`RecyclerView`来展示动态或可交互的数据。 首先,让我们详细了解一下`Dialog`。`...

    《详解Dialog——基础元素构建》源码

    为了复用和管理Dialog,开发者可以创建一个继承自`DialogFragment`的类,将Dialog的相关逻辑封装进去。`DialogFragment`是Android官方推荐的用于在Fragment中展示Dialog的方式,它拥有Fragment的完整生命周期管理。...

    自定义DialogDemo

    考虑到可复用性和代码的整洁性,一个好的实践是将Dialog的相关逻辑封装到一个单独的类中,这个类可以是继承自`DialogFragment`的子类。这样做可以使代码组织得更有结构,易于维护。同时,通过参数化构造函数或方法,...

    安卓Dialog对话框相关-自定义对话框工具类简单好用UI自定义代码简洁.zip

    Android中的Dialog通常通过`AlertDialog.Builder`或`DialogFragment`来创建。`AlertDialog.Builder`允许我们设置标题、消息、按钮等元素,而`DialogFragment`则更适用于与Activity生命周期关联的对话框。 2. **...

    Android 封装不同样式的对话框

    本文将详细讲解如何封装不同样式的对话框,并以仿iOS风格的对话框为例,来提高应用程序的用户体验。 首先,我们了解Android原生的Dialog类。它是一个轻量级窗口,通常用于在当前活动(Activity)之上显示信息,不...

    漂亮动画效果的Dialog

    在实际项目中,我们可以封装这些功能到一个自定义的`DialogFragment`类中,这样可以在多个地方重复使用。同时,为了方便维护和扩展,可以将动画逻辑分离到单独的类或方法中。 总之,创建一个类似"Nifty Modal ...

    Dialog弹出动画

    此外,如果你希望创建一个工具类,方便在多个地方复用自定义Dialog,可以封装上述逻辑,创建一个`CustomDialogUtils`类,提供静态方法来显示Dialog: ```java public class CustomDialogUtils { public static ...

Global site tag (gtag.js) - Google Analytics