Android:Dialog对话框、Builder、showDialog、模板方法设计模式

简介:

1.Dialog对话框:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public  class  MainActivity  extends  Activity  implements  OnClickListener
{
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
                                                                                                                     
         findViewById(R.id.button1).setOnClickListener( this );
         findViewById(R.id.button2).setOnClickListener( this );
     }
                                                                                                                 
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
                                                                                                                 
     @Override
     public  void  onClick(View v)
     {
         switch  (v.getId())
         {
         case  R.id.button1:
             btn1Click();
             break ;
         case  R.id.button2:
             btn2Click();
             break ;
         default :
             break ;
         }
     }
                                                                                                                 
     private  void  btn1Click()
     {
         AlertDialog.Builder builder =  new  AlertDialog.Builder( this );
                                                                                                                     
         // 设置对话框标题、内容、按钮,set方法每次返回this,即dialog本身
         builder.setIcon(R.drawable.ic_launcher); //设置标题图片
         builder.setTitle( "对话框标题" );
         builder.setMessage( "对话框内容" );
         builder.setPositiveButton( "关闭" null ); // 系统只提供三个对话框按钮,区别是默认的显示位置,Neutral在中间
         builder.setNegativeButton( "确定" new  DialogInterface.OnClickListener() // 此处的listener与上面的按钮listener来自于不同包
                 {
                     @Override
                     public  void  onClick(DialogInterface dialog,  int  which)
                     {
                         Log.e( "duihuakuang" "点击了对话框按钮" );
                     }
                 });
         // builder.setNeutralButton("应用", listener);
                                                                                                                     
         AlertDialog dialog = builder.create();
         dialog.show(); //记得加上show()方法
     }
                                                                                                                 
     // 另一种写法,复用创建对象,模板方法设计模式
     private  void  btn2Click()
     {
         showDialog( 0 ); //showDialog方法最终实现了onCreateDialog(0)方法
     }
                                                                                                                 
     //重写onCreateDialog方法,避免重复创建对象
     @Override
     protected  Dialog onCreateDialog( int  id)
     {
        return  new  AlertDialog.Builder( this ).setIcon(R.drawable.ic_launcher)
                 .setTitle( "对话框标题" ).setMessage( "对话框内容" ).setPositiveButton( "关闭" null )
                 .setNegativeButton( "确定" new  DialogInterface.OnClickListener()
                 {
                     @Override
                     public  void  onClick(DialogInterface dialog,  int  which)
                     {
                         Log.e( "duihuakuang" "点击了对话框按钮" );
                     }
                 }).setNeutralButton( "应用" null ).create();
                                                                                                                     
         // return super.onCreateDialog(id);
     }
}




2.定制dialog方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Override
public  void  onClick(View v)
{
     if  (v.getId() == R.id.button1)
     {
         showDialog( 1 );
     }
     if  (v.getId() == R.id.button2)
     {
         showDialog( 2 );
     }
}
@Override
@Deprecated
protected  Dialog onCreateDialog( int  id)
{
     if  (id ==  1 ) //全定制,使用自定义布局
     {
         final  Dialog dialog =  new  Dialog( this );
         dialog.setContentView(R.layout.dialog_layout);
         dialog.findViewById(R.id.button_dialog).setOnClickListener( new  OnClickListener()
         {
             @Override
             public  void  onClick(View v)
             {
                 Toast.makeText(MainActivity. this "定制对话框" , Toast.LENGTH_SHORT).show();
                 dialog.dismiss(); // 关闭对话框
             }
         });
                                                                                                  
         return  dialog;
     }
                                                                                              
     if  (id ==  2 ) //半定制,只修改中间布局
     {
         LayoutInflater inflater = getLayoutInflater();
         View view = inflater.inflate(R.layout.notify_layout,  null );
         return  new  AlertDialog.Builder( this ).setTitle( "半定制对话框" ).setView(view).setPositiveButton( "退出" null ).create();
     }
     return  null ;
                                                                                              
}




3.定制的dialog去掉标题栏和背景色等:

1
2
3
4
5
6
7
8
9
<style name= "myDialogTheme"  parent= "android:Theme.Dialog" >
      <item name= "android:windowFrame" > @null </item>
      <item name= "android:windowIsFloating" > true </item>
      <item name= "android:windowIsTranslucent" > false </item>
      <item name= "android:windowNoTitle" > true </item><!--除去title-->
      <item name= "android:windowContentOverlay" > @null </item>
      <item name= "android:backgroundDimEnabled" > false </item>
      <item name= "android:windowBackground" > @drawable /ic_touming</item><!--除去背景色,也可以 @null -->
  </style>



然后:

1
Dialog dialog =  new  Dialog( this ,R.style.myDialogTheme);



4.activity与dialog对话框之间的交互:


打开对话框:

1
2
3
Bundle bundle =  new  Bundle();
bundle.putString(HBContant.KEY_BUNDLE_DIALOG, mNotifyStr);
showDialog( 1 , bundle);


对话框处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
     // 创建注册填写错误提示对话框
     @Override
     @Deprecated
     protected  Dialog onCreateDialog( int  id)
     {
         final  Dialog dialog =  new  Dialog( this , R.style.customDialogTheme);
         if  (id ==  1 )
         {
             // 获取activity传送过来的值
             dialog.setContentView(R.layout.dialog_singlebtn);
             dialog.findViewById(R.id.dialog_ok).setOnClickListener( new  OnClickListener()
             {
                 @Override
                 public  void  onClick(View v)
                 {
                     dialog.dismiss(); // 关闭对话框
                 }
             });
         }
         return  dialog;
     }
     
     @Override
     @Deprecated
     //每次弹出对话框时被回调以动态更新对话框内容的方法
     protected  void  onPrepareDialog( int  id, Dialog dialog, Bundle args)
     {
         super .onPrepareDialog(id, dialog, args);
         if  (id ==  1 )
         {
             String str = args.getString(HBContant.KEY_BUNDLE_DIALOG);
             TextView dialog_content = (TextView) dialog.findViewById(R.id.dialog_text);
             dialog_content.setText(str);
         }
     }




5.设置对话框的位置和大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
     /**
      * 初始化查询对话框
      */
     private  void  InitSearchDialog()
     {
         View searchDialogLayout = getLayoutInflater().inflate(R.layout.handmaterial_productsearch_window,  null );
         View mBtn_search = searchDialogLayout.findViewById(R.id.productsearch_btn_search);
         
         mBtn_search.setOnClickListener( this );
         
         //创建查询窗口
         AlertDialog.Builder builder =  new  AlertDialog.Builder( this );
         mSearchDialog = builder.setIcon(R.drawable.ic_launcher).setTitle( "查询" ).setView(searchDialogLayout).setNegativeButton( "取消" null )
                 .setPositiveButton( "保存" new  DialogInterface.OnClickListener()
                 {
                     @Override
                     public  void  onClick(DialogInterface dialog,  int  which)
                     {
                         dialog =  null ;
                     }
                 }).create();
     }
     
     /**
      * 显示查询对话框
      */
     private  void  showSearchDialog()
     {
         mSearchDialog.show();
         
         WindowManager wm = getWindowManager();  
         Display d = wm.getDefaultDisplay();   //为获取屏幕宽、高  
         android.view.WindowManager.LayoutParams lp = mSearchDialog.getWindow().getAttributes();   //获取对话框当前的参数值  
         lp.height = ( int ) (d.getHeight() *  0.8 );    //高度设置为屏幕的0.8
         lp.width = ( int ) (d.getWidth() *  0.8 );     //宽度设置为屏幕的0.8 
         mSearchDialog.getWindow().setAttributes(lp);      //设置生效  
     }




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1199508,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
87 3
|
3月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
7月前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
122 1
|
7月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
5月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
131 12
|
6月前
|
Android开发
Android中如何动态的调整Dialog的背景深暗
在Android开发中,Dialog和DialogFragment可通过设置`Window`的`backgroundDimAmount`来控制背景变暗,突出对话框。在DialogFragment的`onCreateDialog`或`onViewCreated`中,获取`Dialog`的`Window`,设置`LayoutParams.dimAmount`(例如0.5f)并添加`FLAG_DIM_BEHIND`标志。要动态调整,可保存`LayoutParams`并在需要时更新。对于Dialog,创建时直接设置同样属性。还可以通过定义主题样式设置背景模糊程度。
157 7
|
6月前
|
API Android开发
32. 【Android教程】对话框:AlertDialog
32. 【Android教程】对话框:AlertDialog
94 2
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6月前
|
设计模式 算法 索引
程序技术好文:设计模式之美:Builder(生成器)
程序技术好文:设计模式之美:Builder(生成器)
|
6月前
|
设计模式 算法
模板方法-大话设计模式
模板方法-大话设计模式