zoukankan      html  css  js  c++  java
  • 【转】 Pro Android学习笔记(四五):Dialog(2):DialogFragment

    [-]

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

  • 相关阅读:
    让c#多点代码段
    SNMP OID介绍
    jsp+servlet+Tomcat+mysql实现用户注册、登录、查看、修改实例之——用户注册
    html+js图片切换示例
    jsp+servlet+Tomcat+mysql实现用户注册、登录、查看、修改实例之——数据库设计
    jsp+servlet+Tomcat+mysql实现用户注册、登录、查看、修改实例之——用户登录
    jsp+servlet+Tomcat+mysql实现用户注册、登录、查看、修改实例之——用户列表显示
    html+js实现城市联动、日期联动示例
    javascript实现文字图片滚动示例
    转载的一份asp.net面试题
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047987.html
Copyright © 2011-2022 走看看