首页 > 其他分享 >Pro Android学习笔记(四四):Dialog(1):触发Dialog

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

时间:2023-04-09 12:01:05浏览次数:30  
标签:ft Dialog show 四四 Pro fragment dialog public String


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小例子中下载。


标签:ft,Dialog,show,四四,Pro,fragment,dialog,public,String
From: https://blog.51cto.com/u_9877302/6178743

相关文章

  • Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
    相对布局:RelativeLayoutRelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置。缺省控件的位置为最上面还最左边。下面结合一个例子来进行解说。<?xmlversinotallow="1.0"encoding="utf-8"?><Relativ......
  • 解决前端启动报错:This is probably not a problem with npm. There is likely additio
    在执行npmrundev运行项目的时候报错:{"os":"darwin","arch":"any"}(current:{"os":"win32","arch":"x64"})npmERR!codeELIFECYCLEnpmERR!errno1npmERR!phantomjs-prebuilt@2.1.16in......
  • 14.ProxySQL中间件01
       Proxysql是基于mysql的一款开源的中间件的产品,是一个灵活的Mysql代理层,可以实现读写分离,支持Query路由功能,支持动态指定某个sql进行缓存,支持动态加载配置信息(无须重启proxysql服务),支持故障切换和sql的过滤功能。相关的网站:  https://www.proxysql.com/   ......
  • 52、K8S-监控机制-Prometheus【理论知识】
    Kubernetes学习目录1、监控基础1.1、监控机制1.1.1、数据层面我们如果要监控数据,首先得有数据,也就是说,这些数据应该可以被记录下来,或者被暴露出来,数据常见的产生、直接或间接暴露方式的方式如下:1、硬件本身的记录信息-以文件或者以内存属性的方式存在2、应用业务的接口-......
  • k8s部署prometheus
    部署到一个k8s集群gitclone-brelease-0.12https://github.com/prometheus-operator/kube-prometheus.gitcdkube-prometheusgrep"image:"./manifests/-R国内无法下载的镜像:以8s.gcr.io开头k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0k8s.gcr.io/prometheu......
  • AI Prompt Engineering 提示工程:提升你的创意与效率
    参考引言AI工具种类也开始进入大繁荣时代。根据There'sanAIForThat网站显示,自2002年-至今,AI社区已经构建了超过2400个AI工具,覆盖577种用途类别(当然,还有很多未收录的AI工具)。虽然AI工具已经有了,但如何用好这些工具却是另外一回事。本文将向您推荐一种名为AIProm......
  • Graduation-Project,Willow-Flowers-and-Love-Letter
    毕设、柳花和情书Datetime:2023-04-04T17:56+08:00Categories:FragmentTags:Diary发现自己没法记住纯音乐,有歌词的歌比较容易记忆,音节会构成旋律,但是纯音乐不一样,听了就忘,有点为此沮丧。但是有两首可以记得的,一首是永远同在,一首是犬夜叉的穿越时空的思念,因为亲自在EOP......
  • Promise基本用法
    JavaScript它的执行环境是单线程的,单线程就是任务只能一个一个的完成,这个任务完成之后才能执行下一个,它会阻塞其它任务。而异步模式可以一起执行多个任务。常见的异步模式有定时器,接口调用和事件函数,Promise就是接口调用里面的一种方式,它是es6提供的一种异步解决方案。简单来说......
  • ProtoBuf 基本使用
    一、是什么ProtocolBuffers,是Google公司开发的一种数据描述语言,是一种平台无关、语言无关、可扩展且类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。二、为什么更简单数据描述文件只需原来的1/10至1/3解析速度是原来的20倍至100倍减少了二义性生成了更......
  • EECS 280 Project 5: Machine Learning
    EECS280Project5:MachineLearningDue8:00pmTuesdayApril18,2023.Youmayworkaloneorwithapartner(partnershipguidelines).Winter2023release.IntroductionAutomaticallyidentifythesubjectofpostsfromtheEECS280Piazzausingnaturallanguag......