Android多种方式实现自定义Dialog对话框

现今的APP开发都很讲究用户体验,而系统提供的原生工具都长得比较丑,或者功能不满足我们的需求。这个时候我们想到的是自定义,而Dialog对话框也是经常需要自定义的一个工具。必须让它符合我们整体的风格!!下面就来介绍下三种自定义dialog的方法。




首先需要一个自定义的布局XML文件

自定义 Dialog 可以通过 XML 或者 Java 代码的方式去定义新 Dialog 的界面。在这里我们使用 XML 文件,这样会比较直观。

在下面我做了一个简单的布局来演示自定义功能。
xml 文件的代码:
[XML]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
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
<? xml version = "1.0" encoding = "utf-8" ?>
 
< RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
 
     android:layout_width = "300dp"
 
     android:layout_height = "match_parent"
 
      >
 
  
 
     < TextView
 
         android:id = "@+id/textView1"
 
         android:layout_width = "wrap_content"
 
         android:layout_height = "wrap_content"
 
         android:layout_alignParentTop = "true"
 
         android:layout_centerHorizontal = "true"
 
         android:text = "www.apkbus.com" />
 
  
 
     < TextView
 
         android:id = "@+id/textView2"
 
         android:layout_width = "wrap_content"
 
         android:layout_height = "wrap_content"
 
         android:layout_below = "@+id/textView1"
 
         android:layout_centerHorizontal = "true"
 
         android:layout_marginTop = "14dp"
 
         android:text = "自定义Dialog demo" />
 
  
 
     < TextView
 
         android:id = "@+id/dialog_name_textview"
 
         android:layout_width = "wrap_content"
 
         android:layout_height = "wrap_content"
 
         android:layout_below = "@+id/textView2"
 
         android:layout_centerHorizontal = "true"
 
         android:text = "TextView" />
 
  
 
     < Button
 
         android:id = "@+id/cancel_button"
 
         android:layout_width = "100dp"
 
         android:layout_height = "wrap_content"
 
         android:layout_below = "@+id/dialog_name_textview"
 
         android:layout_centerHorizontal = "true"
 
         android:layout_marginTop = "16dp"
 
         android:text = "关闭" />
 
  
 
</ RelativeLayout >

一、继承Dialog类实现

这个也许是比较常用的一个方法了,通过继承 Dialog 类然后使用自己的布局文件来实现自定义。实现起来也是很简单的。
下面来看看代码:
[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
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
package com.apkbus.apkbusdialog;
 
  
 
import android.app.Dialog;
 
import android.content.Context;
 
import android.os.Bundle;
 
import android.view.View;
 
import android.widget.TextView;
 
  
 
  
 
public class MyDialog  extends Dialog {
 
  
 
private String dialogName;
 
 
  
 
public MyDialog(Context context,String dialogName) {
 
super (context);
 
this .dialogName = dialogName;
 
}
 
  
 
@Override
 
protected void onCreate(Bundle savedInstanceState) {
 
super .onCreate(savedInstanceState);
 
requestWindowFeature(Window.FEATURE_NO_TITLE);
 
setContentView(R.layout.my_dialog);
 
((TextView) findViewById(R.id.dialog_name_textview)).setText(dialogName);
 
findViewById(R.id.cancel_button).setOnClickListener( new View.OnClickListener() {
 
 
@Override
 
public void onClick(View v) {
 
dismiss();
 
 
}
 
});
 
}
 
  
 
}


说明:
1 、需要实现一个非默认的构造函数,如果没有系统会提示有错。
2 、需要实现一个 onCreate(Bundle savedInstanceState) 方法,在这里可以通过 setContentView(R.layout.my_dialog); 方法设置您的自定义布局,然后就是对布局控件的绑定,初始化等操作了。
3 、关于 Dialog 自带的标题栏,如果不需要可以通过在 onCreate 方法中调用以下方法来去掉标题栏
[Java]  纯文本查看  复制代码
?
1
requestWindowFeature(Window.FEATURE_NO_TITLE);



使用:

完成了以上步骤之后,在需要调用的地方写上如下代码就可以启动我们的自定义 Dialog 啦。

[Java]  纯文本查看  复制代码
?
1
2
3
MyDialog myDialog =  new MyDialog( this "我是继承Dialog类实现的自定义Dialog" );
 
myDialog.show();


二、设置Activity属性实现
而这里是通过在AndroidManifest设置Activity 的属性
[XML]  纯文本查看  复制代码
?
1
android:theme="@android:style/Theme.Dialog"

然后在 activity 就是平时的做法了。

[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
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
package com.apkbus.apkbusdialog;
 
  
 
import android.app.Activity;
 
import android.os.Bundle;
 
import android.view.View;
 
import android.view.View.OnClickListener;
 
import android.view.Window;
 
import android.widget.TextView;
 
  
 
public class DialogActivity  extends Activity{
 
 
@Override
 
protected void onCreate(Bundle savedInstanceState) {
 
super .onCreate(savedInstanceState);
 
requestWindowFeature(Window.FEATURE_NO_TITLE);
 
setContentView(R.layout.my_dialog);
 
((TextView) findViewById(R.id.dialog_name_textview)).setText( "我是Activity实现的自定义dialog" );
 
findViewById(R.id.cancel_button).setOnClickListener( new OnClickListener() {
 
 
public void onClick(View v) {
 
DialogActivity. this .finish();
 
 
}
 
});
 
}
 
}


说明:
就像上面的代码一样,activity 中并不需要做什么特别的操作。只是一个界面变成了 Dialog 的普通 activity ,操作跟以前一样。
只需要在 AndroidManifest设置Activity 的属性
[XML]  纯文本查看  复制代码
?
1
android:theme="@android:style/Theme.Dialog"



使用:

既然只是可以界面稍有不同的activity ,那么在调用上也是跟 activity 的调用一样

[Java]  纯文本查看  复制代码
?
1
startActivity( new Intent( this , DialogActivity. class ));



三、用PopupWindow实现

PopupWindow实现的可能跟上面的风格是不一样的,PopupWindow通过简单的设置就可以使用自定义布局。

[Java]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
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
private void showPopupWindow(View v){
 
View dialogView = LayoutInflater.from( this ).inflate(R.layout.my_dialog,  null );
 
((TextView) dialogView.findViewById(R.id.dialog_name_textview)).setText( "我是PopupWindow实现的自定义Dialog" );
 
dialogView.findViewById(R.id.cancel_button).setOnClickListener( new OnClickListener() {
 
 
@Override
 
public void onClick(View v) {
 
myPopupWindow.dismiss();
 
 
}
 
});
 
myPopupWindow =  new PopupWindow(dialogView,  600 , LayoutParams.WRAP_CONTENT);
 
 
// 使其聚集
 
myPopupWindow.setFocusable( true );
 
         // 设置允许在外点击消失
 
myPopupWindow.setOutsideTouchable( true );
 
//设置背景,不设置背景点击返回按钮无法关闭PopupWindow
 
myPopupWindow.setBackgroundDrawable( new ColorDrawable(Color.CYAN));
 
 
myPopupWindow.showAsDropDown(v);
 
}


说明:
PopupWindow的使用主要有下面几个步骤

1 、使用 LayoutInflater 获得自定义布局的 View对象
[Java]  纯文本查看  复制代码
?
1
View dialogView = LayoutInflater.from( this ).inflate(R.layout.my_dialog,  null );

2 、初始化的时候设置我们的布局的 View 对象进去,同时设置PopupWindow的宽高。
[Java]  纯文本查看  复制代码
?
1
myPopupWindow =  new PopupWindow(dialogView,  600 , LayoutParams.WRAP_CONTENT);

3 、显示PopupWindow,下面的方法是显示PopupWindow在某个view 的下面。
[Java]  纯文本查看  复制代码
?
1
myPopupWindow.showAsDropDown(v);



使用:
在需要调用的位置调用上面的方法即可。
[Java]  纯文本查看  复制代码
?
1
showPopupWindow(v);

三种方式的优缺点
1 Dialog 的位置相对固定,而 PopupWindow 的位置可以随意
2 Dialog 是非阻塞线程的,而 PopupWindow 是阻塞线程的
3 activity 的方式是位置可以相对随意,并非阻塞线程



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值