• 【转】 Pro Android学习笔记(四四):Dialog(1):触发Dialog


    目录(?)[-]

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

  • 相关阅读:
    处理数据
    Vue--Vue常用指令及操作
    Vue--Vue实例
    ES6--解构赋值
    ES6--入门
    前端模块化开发
    Node.js--入门
    HTML5--canvas与svg的使用
    input整理
    移动端开发入门
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047985.html
Copyright © 2020-2023  润新知