首页 > 其他分享 >Pro Android学习笔记(四五):Dialog(2):DialogFragment

Pro Android学习笔记(四五):Dialog(2):DialogFragment

时间:2023-04-09 12:01:25浏览次数:41  
标签:onCreateView Dialog 对话框 Pro id dialog Override Android public


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

重写onCreateView()

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

Pro Android学习笔记(四五):Dialog(2):DialogFragment_ide

通过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中,适用于创建简单对话框。

Pro Android学习笔记(四五):Dialog(2):DialogFragment_UI_02

代码如下。虽然都是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小例子中下载。


标签:onCreateView,Dialog,对话框,Pro,id,dialog,Override,Android,public
From: https://blog.51cto.com/u_9877302/6178742

相关文章

  • Pro Android学习笔记(四四):Dialog(1):触发Dialog
    Android提供alert、prompt、pick-list,单选、多选,progress、time-picker和date-picker对话框,并提供自定义的dialog。在Android3.0后,dialog基于fragment,并对之前版本提供兼容支持库,也就是说对于开发者而言,dialog是基于DialogFragment的,但此时需要在应用中加入相关的兼容库。和Window......
  • Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
    相对布局:RelativeLayoutRelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置。缺省控件的位置为最上面还最左边。下面结合一个例子来进行解说。<?xmlversinotallow="1.0"encoding="utf-8"?><Relativ......
  • Android遇到内存泄漏和性能优化,需要采取以下措施
    内存泄漏:a.使用内存分析工具,如AndroidStudio的MemoryProfiler或LeakCanary,找出内存泄漏的位置,并修复代码。b.避免在Activity或Fragment中使用静态变量或单例模式,因为它们可能会持有对Activity或Fragment的引用,并导致内存泄漏。c.及时释放不再使用的资源,如关闭文件、释放......
  • 解决前端启动报错: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......
  • Mac M1安装android sdk
    我这边是MacBookproM1芯片的电脑,需要安装androidsdk我在网上找了一圈,没有找到合适的sdk,要么是版本太老,要么是其他原因,后来我直接通过我的idea中进行下载,idea中搜索androidsdk即可下载edit进行安装,之后等待,好了之后进入此路径中,发现adb--version正常了主题你如果在网......
  • Android学习笔记(五二):服务Service(中)- 继承Service类
    通过IntentService的继承类实现命令触发的服务,也可以直接通过Service的继承类来实现。在IntentService中的例子,我们增加了StopService()的方式,用于试验。在实际应用中,IntentService常用于一次性运行,自动结束的情况,不需要人工停止干预。对于需要人工干预的停止的,长时间(或无限制)运行......
  • android沉浸状态栏+导航栏(小白条) 小白教程 (基于安卓官方教程)
    沉浸状态栏+导航栏(小白条)是基本操作,但是网上的很多教程都是错误的...,安卓官方的教程对小白很不友好,所以记录下我的实现过程供大家参考。前置知识状态栏是屏幕顶部显示时间、通知图标等等的地方导航栏就是屏幕下方用于提供返回,返回桌面,进入多任务界面的的三个按键或着小白条......
  • 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、应用业务的接口-......
  • AndroidBanner - ViewPager 03
    AndroidBanner-ViewPager03上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题:当banner不可见的时候,也需要停止轮播给banner设置点击事件,长时间的触摸也会被默认是一个点击事件这篇文章就来解决这些问题,并处理一下banner的......