[-]

  1. 重写onCreateView
    1. 通过onCreateView设置UI和按键反馈
    2. 信息保存
  2. 重写onCreateDialog

DialogFragment的实例newInstance()已经在上一次学习笔记中实现。我们创建dialog的UI,可以通过重写DialogFragment的两个函数当中的一个来实现,这两个函数是onCreateView()和onCreateDialog(),前者返回view,后者返回dialog,如同通过AlertDialog.Builder构造一样。

重写onCreateView()

重写onCreateView()是fragment的传统方式,适合自定义的对话框,本例适合用于提示框,如下图所示。通过按菜单弹出提示框,提示框由一个TextView,一个EditText和三个Button组成UI。按不同的按钮触发不同的处理。小例子自作范例,按Save和Dismiss按钮,都会调用Activity的onDialogDone()函数,根据用户的实际操作,显示不同的信息。按Help按钮,则弹出一个帮助框。再弹框在稍后学习笔记中实现。

通过onCreateView()设置UI和按键反馈

利用Fragment的onCreateView()来实现对话框的UI和Fragment学习中没有差别,在本例中,我们增加了按钮点击的触发,代码如下:

public class PromptDialogFragment extends DialogFragment implements OnClickListener
    public static PromptDialogFragment newInstance(String prompt){
        ...略... 
    }

@Override //通过重写Fragment的onCreateView()实现dialog的UI
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        //1、通过inflate,根据layout XML定义,创建view 
        View v = inflater.inflate(R.layout.prompt_dialog, container,false); 
        TextView tv = (TextView)v.findViewById(R.id.prompt_message); 
        tv.setText(getPrompt()); 
        //2、注册三个button的按键监听listener 
        Button dismissBtn = (Button)v.findViewById(R.id.button_dismiss); 
        dismissBtn.setOnClickListener(this);          
        Button saveBtn = (Button)v.findViewById(R.id.button_save); 
        saveBtn.setOnClickListener(this);          
        Button helpBtn = (Button)v.findViewById(R.id.button_help); 
        helpBtn.setOnClickListener(this); 
        return v; 
    } 
     
    private String getPrompt(){ 
        Bundle b = getArguments(); 
        return b.getString("prompt-message"); 
    }

@Override //在onCreate中设置对话框的风格、属性等
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState); 
        //如果setCancelable()中参数为true,若点击dialog覆盖不到的activity的空白或者按返回键,则进行cancel,状态检测依次onCancel()和onDismiss()。如参数为false,则按空白处或返回键无反应。缺省为true 
        setCancelable(true); 
        //可以设置dialog的显示风格,如style为STYLE_NO_TITLE,将被显示title。遗憾的是,我没有在DialogFragment中找到设置title内容的方法。theme为0,表示由系统选择合适的theme。
        int style = DialogFragment.STYLE_NO_NORMAL, theme = 0; 
        setStyle(style,theme);  
    }

@Override //仅用于状态跟踪
    public void onCancel(DialogInterface dialog) {  
        showInfo("onCancel() is called"); 
        super.onCancel(dialog); 
    }

@Override  //仅用户状态跟踪
    public void onDismiss(DialogInterface dialog) {  
        showInfo("onDismiss() is called"); 
        super.onDismiss(dialog); 
    }

@Override //Button按键触发的回调函数
    public void onClick(View v) {  
        MainActivity act = (MainActivity)getActivity(); 
        switch(v.getId()){ 
        case R.id.button_dismiss: 
            act.onDialogDone(getTag(), true, null);  //调用activity的onDialogDone(),通过Toast显示相关信息 
            dismiss();  //关闭对话框,并触发onDismiss()回调函数。
            break; 
        case R.id.button_help:  
            … 略:以后实现 … 
            break; 
        case R.id.button_save: 
            TextView tv = (TextView)getView().findViewById(R.id.input_text); 
            act.onDialogDone(getTag(), false, "[save]" + tv.getText()); //调用activity的onDialogDone(),通过Toast显示相关信息 
            dismiss(); //关闭对话框,并触发onDismiss()回调函数
            break; 
        default: 
            break; 
        } 
    } 
     
    private void showInfo(String s){ 
        Log.d("PromptDialogFragment",s);    
    } 
}

信息保存

如果用户在输入框中填入text,然后进行屏幕的横屏和竖屏切换,这涉及到填入内容的保存,可以通过onSaveInstanceState(),将之保存到fragment的Bundle savedInstanceState中,并在onCreateView()中将之恢复。但是在Android 4.2版本的测试中,系统已经能够自动保存和恢复,无需加入代码。当然,安全地我们仍建议进行以下处理。

public class PromptDialogFragment extends DialogFragment implements OnClickListener{
    private EditText et = null;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ......    
        et = (EditText)v.findViewById(R.id.input_text);
        if(savedInstanceState != null){
            CharSequence text = savedInstanceState.getCharSequence("input");
            et.setText(text == null ? "" : text);
        }
        ......        
    }    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putCharSequence("input", et.getText());
        super.onSaveInstanceState(outState);
    }
}

重写onCreateDialog()

对于简单的对话框,可以通过AlterDialog.Builder直接创建对话框的UI,本例用于告警框,如下图。AlertDialog.Builder在Android 3.0版本之前的创建对话框方式,在之后的版本中,可用在DialogFragment中,适用于创建简单对话框。

代码如下。虽然都是OnClickListener接口,但提示框的是View.OnClickListener,这里是DialogInterface.OnClickListener。

public class AlterDialogFragment extends DialogFragment implements DialogInterface.OnClickListener
    /*【步骤1】:通过newInstance()创建实例并返回* */ 
    public static AlterDialogFragment newInstance(String title,String message){
        … 略 …  
    }  
         
    private String getTitle(){
        return getArguments().getString("alert-title"); 
    } 
    
    private String getMessage(){ 
        return getArguments().getString("alert-message"); 
    } 
    
    /* 【步骤2】创建view可以通过两个途径,一是fragment中的onCreateView(),二是DialogFragment中的onCreateDialog()。
     * 前者适合对自定义的layout进行设置,具有更大的灵活性 
     * 而后者适合对简单dialog进行处理,可以利用Dialog.Builder直接返回Dialog对象 
     * 从生命周期的顺序而言,先执行onCreateDialog(),后执行oonCreateView(),我们不应同时使用两者。 
     * */
 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) {  
        AlertDialog.Builder b = new AlertDialog.Builder(getActivity()) 
                                    .setTitle(getTitle()) 
                                    .setMessage(getMessage()) 
                                    .setPositiveButton("OK", this)
  //设置回调函数 
                                    .setNegativeButton("Cancel",this); //设置回调函数
        return b.create(); 
   }

@Override //按键触发的回调函数
    public void onClick(DialogInterface dialog, int which) {  
        boolean isCancel = false; 
        if(which == AlertDialog.BUTTON_NEGATIVE){ //判断用户所按何键 
            isCancel = true; 
        }  
        MyActivity act = (MyActivity) getActivity(); 
        act.onDialogDone(getTag(), isCancel, "CLick OK, Alert dismissed"); 
    }

}

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

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

【转】 Pro Android学习笔记(四五):Dialog(2):DialogFragment的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  10. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

随机推荐

  1. PHP开发环境搭建(转载)

    转载自:http://blog.csdn.net/rosetta/article/details/53967215 前言   最近学了n种语言,学每种语言的套路无非就是先搭建一个开发环境,再找本书或者 ...

  2. FPGA低温不能启动分析

    FPGA低温不能启动分析 现象描写叙述:在给medium板光端机做低温试验时,分别给发送版.接收板断电又一次启动,发现有的板子在-40°能够启动,而有些板子在-20°都不能启动.须要升高温度到0°以上 ...

  3. C调用Lua中的函数解析table

    Passing Tables to Lua Functions A use case that happens often is the passing of tables to and from L ...

  4. Java并发之BlockingQueue

      一.Queue Queue是队列接口是 Collection的子接口.除了基本的 Collection操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时 ...

  5. STM32 HAL库 UART使用printf

    // 添加这个函数 int fputc(int ch,FILE *f) { uint8_t temp[]={ch}; HAL_UART_Transmit(&UartHandle,temp,,) ...

  6. DAS、NAS、SAN

    目前磁盘存储市场上,存储分类(如下表一)根据服务器类型分为:封闭系统的存储和开放系统的存储,封闭系统主要指大型机,AS400等服务器, 开放系统指基于包括Windows.UNIX.Linux等操作系统 ...

  7. requests ip代理池单ip和多ip设置方式

    reqeusts库,在使用ip代理时,单ip代理和多ip代理的写法不同 (目前测试通过,如有错误,请评论指正) 单ip代理模式 省去headers等 import requests proxy = { ...

  8. python3.7.1 内置函数

    python3.7.1 内置函数列表 内置函数 abs() delattr() hash() memoryview() set() all() dict() help() min() setattr( ...

  9. mysql设置有外键的主键自增及其他

    有外键的主键设置自增. ; ALTER TABLE `<table>` MODIFY COLUMN `id` ) NOT NULL AUTO_INCREMENT FIRST; 创建数据库, ...

  10. m3u8格式转MP4

    公司直播平台使用的是七牛直播,今天有客户表示想将直播回放视频下载下来,数据妹子犯了愁,表示这个不会下载给客户,于是乎这个任务就落在了我的头上.熟练的打开视频,在 HTML 源代码播放地址为 http: ...