目录(?)[-]

  1. 创建dialog fragment
  2. Activity显示对话框

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开发相关文章

【转】 Pro Android学习笔记(四四):Dialog(1):触发Dialog的更多相关文章

  1. 【转】 Pro Android学习笔记(四五):Dialog(2):DialogFragment

    [-] 重写onCreateView 通过onCreateView设置UI和按键反馈 信息保存 重写onCreateDialog DialogFragment的实例newInstance()已经在上一 ...

  2. 【转】Pro Android学习笔记(四六):Dialog(3):对话框弹对话框

    目录(?)[-] 帮助提示框的实现 实现再弹框 再谈fragment管理器 提示框的按钮Help,将触发弹出新的帮助提示框. 帮助提示框的实现 帮助提示框的实现很简单,利用重写onCreateView ...

  3. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  4. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  5. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  6. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  7. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  8. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  9. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  10. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

随机推荐

  1. HDU - 1272 小希的迷宫 【并查集】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 思路 只需要判断 这张图 无环 并且只有一个连通块 就可以了 要注意 如果 只输入 0 0 那给 ...

  2. DNS 原理入门 (转)

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  3. c++之helloworld与命名空间

    首先在linux中需要安装g++编译器. 在中端输入 uname -a,可以查看版本信息. 输入g++,如果提示错误.则需要使用sudo apt-get install g++. #include&l ...

  4. 跨平台(I版到K版)迁移实践总结

           所谓跨平台迁移,对于了解openstack冷迁移过程的同学来说,其实就是手动去执行冷迁移的代码行为,当然像我这种抵制体力劳动的人,肯定会想写脚本去跑,即使不会也要边学边用. 迁移并非想象 ...

  5. nginx配置大全

    nginx配置大全

  6. dsp2812 pwm配置

    肚子疼了好几天,今天稍微好点,简单写点东西. 好几个月前做的项目,有些地方已经记不清楚了,但是突然客户又来问关于代码配置的情况,重新查看了代码,把相关的知识也整理一下. dsp2812中有好几个时钟相 ...

  7. <再看TCP/IP第一卷>TCP/IP协议族中的最压轴戏----TCP协议及细节

    题外话:刚刚过去的半个月实在是忙得我喘不过来气,虽然手里还压着几个项目得在期末考试之前做完,但是想想还是更新一下随笔,稍微换个心情.另外小吐槽一下那些在博客园里原封不动抄书当随笔的人,唉真是....算 ...

  8. 遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题

    在将数据库从sqlserver2000迁移到2005后,原有的用户名TDS在执行存储过程是报错:“拒绝了对对象的 EXECUTE 权限”. 如网上所说,在使用的数据库的属性页->权限中给TDS添 ...

  9. Hive- Hive 按时间定期插入分区表

    写个shell脚本Hive 按时间定期插入分区表,由于今天统计的是昨天的数据所以日期减一. #!/bin/bash DT=`date -d '-1 day' "+%Y-%m-%d" ...

  10. Cuckoo hash算法分析——其根本思想和bloom filter一致 增加hash函数来解决碰撞 节省了空间但代价是查找次数增加

    基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理碰撞 ...