效果图:
前言:
最近在项目中遇到一个问题,就是启动页弹窗提示一个隐私政策的操作。我一开始用的是Dialog,但是为了符合公司的"审美"(装B),所以为了使弹窗不那么单调,我换成了PopupWindow,上线一段时间后,随着用户的增加,出现了问题,让我很是头痛。原因是,在Android6.0之后的版本,弹窗都是正常居中显示,但是Android6.0之前(包含6.0)弹窗消失了。同时我给设置了弹窗出现时,点击外部不能取消,所以导致6.0的用户在使用时,卡在了欢迎界面。网上找了很多博客,也没有解决我的问题,所以,又换回了DIalog。不同的是 为了美观,实现一个自定义Dialog。
一、创建自定义Dialog
1.创建一个类:CommonDialog并继承Dialog。
下面附上我的代码:
public class CommonDialog extends Dialog {
/**
* 显示的图片
*/
private ImageViewimageIv ;
/**
* 显示的标题
*/
private TextViewtitleTv ;
/**
* 显示的消息
*/
private TextViewmessageTv ;
/**
* 确认和取消按钮
*/
private ButtonnegtiveBn ,positiveBn;
/**
* 按钮之间的分割线
*/
private ViewcolumnLineView ;
private TextViewprivacy;
public CommonDialog(Context context) {
super(context, R.style.CustomDialog);
}
/**
* 都是内容数据
*/
private Stringmessage;
private Stringtitle;
private Stringpositive,negtive ;
private int imageResId = -1 ;
/**
* 底部是否只有一个按钮
*/
private boolean isSingle =false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_layout_dialog);
//按空白处不能取消动画
setCanceledOnTouchOutside(false);
//初始化界面控件
initView();
//初始化界面数据
refreshView();
//初始化界面控件的事件
initEvent();
}
/**
* 初始化界面的确定和取消监听器
*/
private void initEvent() {
//设置确定按钮被点击后,向外界提供监听
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickBottomListener!=null) {
onClickBottomListener.onPositiveClick();
}
}
});
//设置取消按钮被点击后,向外界提供监听
negtiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickBottomListener!=null) {
onClickBottomListener.onNegtiveClick();
}
}
});
//设置隐私政策被点击后,向外界提供监听
privacy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(onClickBottomListener!=null){
onClickBottomListener.onPrivacyClick();
}
}
});
}
/**
* 初始化界面控件的显示数据
*/
private void refreshView() {
//如果用户自定了title和message
if (!TextUtils.isEmpty(title)) {
titleTv.setText(title);
titleTv.setVisibility(View.VISIBLE);
}else {
titleTv.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(message)) {
messageTv.setText(message);
}
//如果设置按钮的文字
if (!TextUtils.isEmpty(positive)) {
positiveBn.setText(positive);
}else {
positiveBn.setText("确定");
}
if (!TextUtils.isEmpty(negtive)) {
negtiveBn.setText(negtive);
}else {
negtiveBn.setText("取消");
}
if (imageResId!=-1){
i mageIv.setImageResource(imageResId);
imageIv.setVisibility(View.VISIBLE);
}else {
imageIv.setVisibility(View.GONE);
}
/**
* 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
*/
if (isSingle){
columnLineView.setVisibility(View.GONE);
negtiveBn.setVisibility(View.GONE);
}else {
negtiveBn.setVisibility(View.VISIBLE);
columnLineView.setVisibility(View.VISIBLE);
}
}
@Override
public void show() {
super.show();
refreshView();
}
/**
* 初始化界面控件
*/
private void initView() {
negtiveBn = (Button) findViewById(R.id.negtive);
positiveBn = (Button) findViewById(R.id.positive);
titleTv = (TextView) findViewById(R.id.title);
messageTv = (TextView) findViewById(R.id.message);
imageIv = (ImageView) findViewById(R.id.image);
columnLineView = findViewById(R.id.column_line);
privacy = findViewById(R.id.privacy);
}
/**
* 设置确定取消按钮的回调
*/
public OnClickBottomListeneronClickBottomListener;
public CommonDialogsetOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
this.onClickBottomListener = onClickBottomListener;
return this;
}
public interface OnClickBottomListener{
/**
* 点击确定按钮事件
*/
public void onPositiveClick();
/**
* 点击取消按钮事件
*/
public void onNegtiveClick();
/**
* 点击隐私政策事件
*/
public void onPrivacyClick();
}
public StringgetMessage() {
return message;
}
public CommonDialogsetMessage(String message) {
this.message = message;
return this ;
}
public StringgetTitle() {
return title;
}
public CommonDialogsetTitle(String title) {
this.title = title;
return this ;
}
public StringgetPositive() {
return positive;
}
public CommonDialogsetPositive(String positive) {
this.positive = positive;
return this ;
}
public StringgetNegtive() {
return negtive;
}
public CommonDialogsetNegtive(String negtive) {
this.negtive = negtive;
return this ;
}
public int getImageResId() {
return imageResId;
}
public boolean isSingle() {
return isSingle;
}
public CommonDialogsetSingle(boolean single) {
isSingle = single;
return this ;
}
public CommonDialogsetImageResId(int imageResId) {
this.imageResId = imageResId;
return this ;
}
}
上面的代码自己看看 然后你就可以直接复制拿去用了。
然后补充一个style文件 和xml文件
style:
xml:
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerInParent="true"
android:paddingTop="16dp"
android:background="@drawable/base_dialog_bg"
xmlns:tools="http://schemas.android.com/tools">
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:gravity="center"
tools:text="消息提示"
android:visibility="visible"
android:textColor="#333333"
android:textSize="18sp" />
android:id="@+id/image"
tools:src="@mipmap/ic_launcher"
android:layout_gravity="center"
android:maxHeight="150dp"
android:maxWidth="150dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_gravity="center"
android:layout_width="300dp"
android:layout_height="400dp">
android:id="@+id/message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center|left"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:lineSpacingExtra="3dp"
android:lineSpacingMultiplier="1.2"
android:textSize="14dp"
android:textColor="#999999"
tools:text="提示消息" />
android:id="@+id/privacy"
android:textSize="@dimen/dp_14"
android:textColor="#38ADFF"
android:layout_marginTop="@dimen/dp_16"
android:layout_gravity="center"
android:text="隐私政策"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="16dp"
android:background="#E4E4E4" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:id="@+id/negtive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:layout_weight="1"
android:background="@null"
android:gravity="center"
android:singleLine="true"
tools:text="No"
android:textColor="#999999"
android:textSize="16sp" />
android:id="@+id/column_line"
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#E4E4E4" />
android:id="@+id/positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:background="@null"
android:gravity="center"
android:singleLine="true"
tools:text="Yes"
android:textColor="#38ADFF"
android:textSize="16sp" />
以上为止,我们所需的东西就全部凑齐了。接下来看用法:
在我们需要弹窗的Activity或者fragment中创建一个方法:initDialog();
方法中,new一个我们刚创建的Dialog类。
CommonDialog commonDialog =new CommonDialog(上下文对象);
commonDialog .setTitle("标题")
.setMessage("提示内容")
.setSingle(true/false)//false为双选,true为单选。看自己需求
.setOnClickBottomListener(new CommonDialog.OnClickBottomListener()){
@Override
public void onPositiveClick() {
startActivity(MainActivity.class);//做你想做的事。
finish();
}
@Override
public void onNegtiveClick() {
//退出程序
System.exit(0);
}
}).show();
//当Dialog出现时,返回键失效
commonDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
if(keyEvent.getKeyCode()==KeyEvent.KEYCODE_BACK){
return true;
}
return false;
}
});
好了,到这里,一个简单的自定义Dialog就完成了,赶紧拿去试试吧。
注意:具体需求,直接改动就可以。代码简单也好懂。