自定義Dialog是一個非常常見的需求泣侮,Dialog上可以顯示圖標(biāo)述雾,或者標(biāo)題友酱,顯示1個或者2個兩個按鈕驳庭。
效果如下:
image.png
image.png
先定義Dialog樣式:
<style name="CustomDialog" parent="android:style/Theme.Dialog">
<!--背景顏色及和透明程度-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否去除標(biāo)題 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除邊框-->
<item name="android:windowFrame">@null</item>
<!--是否浮現(xiàn)在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否模糊-->
<item name="android:backgroundDimEnabled">true</item>
</style>
再去定義對話框的布局刑顺,首先來個圓角背景:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:width="0.8dp"
android:color="#ffffff" />
<!-- 圓角 -->
<corners android:radius="6dp" />
</shape>
布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="260dp"
android:layout_centerInParent="true"
android:paddingTop="16dp"
android:background="@drawable/bg_dialog"
android:orientation="vertical">
<TextView
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" />
<ImageView
android:id="@+id/image"
tools:src="@mipmap/p1"
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" />
<TextView
android:id="@+id/message"
android:layout_width="match_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="提示消息提示消息提示消息提示消息提示消息提示消息提示消息提示消息" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="16dp"
android:background="#E4E4E4" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
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" />
<View
android:id="@+id/column_line"
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#E4E4E4" />
<Button
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" />
</LinearLayout>
</LinearLayout>
最后送上Dialog源碼:
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.wzh.myapplication.R;
/**
* description:自定義dialog
*/
public class CommonDialog extends Dialog {
/**
* 顯示的圖片
*/
private ImageView imageIv ;
/**
* 顯示的標(biāo)題
*/
private TextView titleTv ;
/**
* 顯示的消息
*/
private TextView messageTv ;
/**
* 確認(rèn)和取消按鈕
*/
private Button negtiveBn ,positiveBn;
/**
* 按鈕之間的分割線
*/
private View columnLineView ;
public CommonDialog(Context context) {
super(context, R.style.CustomDialog);
}
/**
* 都是內(nèi)容數(shù)據(jù)
*/
private String message;
private String title;
private String positive,negtive ;
private int imageResId = -1 ;
/**
* 底部是否只有一個按鈕
*/
private boolean isSingle = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.common_dialog_layout);
//按空白處不能取消動畫
setCanceledOnTouchOutside(false);
//初始化界面控件
initView();
//初始化界面數(shù)據(jù)
refreshView();
//初始化界面控件的事件
initEvent();
}
/**
* 初始化界面的確定和取消監(jiān)聽器
*/
private void initEvent() {
//設(shè)置確定按鈕被點(diǎn)擊后,向外界提供監(jiān)聽
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( onClickBottomListener!= null) {
onClickBottomListener.onPositiveClick();
}
}
});
//設(shè)置取消按鈕被點(diǎn)擊后饲常,向外界提供監(jiān)聽
negtiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( onClickBottomListener!= null) {
onClickBottomListener.onNegtiveClick();
}
}
});
}
/**
* 初始化界面控件的顯示數(shù)據(jù)
*/
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);
}
//如果設(shè)置按鈕的文字
if (!TextUtils.isEmpty(positive)) {
positiveBn.setText(positive);
}else {
positiveBn.setText("確定");
}
if (!TextUtils.isEmpty(negtive)) {
negtiveBn.setText(negtive);
}else {
negtiveBn.setText("取消");
}
if (imageResId!=-1){
imageIv.setImageResource(imageResId);
imageIv.setVisibility(View.VISIBLE);
}else {
imageIv.setVisibility(View.GONE);
}
/**
* 只顯示一個按鈕的時候隱藏取消按鈕蹲堂,回掉只執(zhí)行確定的事件
*/
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);
}
/**
* 設(shè)置確定取消按鈕的回調(diào)
*/
public OnClickBottomListener onClickBottomListener;
public CommonDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
this.onClickBottomListener = onClickBottomListener;
return this;
}
public interface OnClickBottomListener{
/**
* 點(diǎn)擊確定按鈕事件
*/
public void onPositiveClick();
/**
* 點(diǎn)擊取消按鈕事件
*/
public void onNegtiveClick();
}
public String getMessage() {
return message;
}
public CommonDialog setMessage(String message) {
this.message = message;
return this ;
}
public String getTitle() {
return title;
}
public CommonDialog setTitle(String title) {
this.title = title;
return this ;
}
public String getPositive() {
return positive;
}
public CommonDialog setPositive(String positive) {
this.positive = positive;
return this ;
}
public String getNegtive() {
return negtive;
}
public CommonDialog setNegtive(String negtive) {
this.negtive = negtive;
return this ;
}
public int getImageResId() {
return imageResId;
}
public boolean isSingle() {
return isSingle;
}
public CommonDialog setSingle(boolean single) {
isSingle = single;
return this ;
}
public CommonDialog setImageResId(int imageResId) {
this.imageResId = imageResId;
return this ;
}
}
好了,下面就是使用了:
private void initDialog() {
final CommonDialog dialog = new CommonDialog(MainActivity.this);
dialog.setMessage("這是一個自定義Dialog贝淤。")
.setImageResId(R.mipmap.ic_launcher)
// .setTitle("系統(tǒng)提示")
.setSingle(true).setOnClickBottomListener(new CommonDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
dialog.dismiss();
Toast.makeText(MainActivity.this,"xxxx",Toast.LENGTH_SHORT).show();
}
@Override
public void onNegtiveClick() {
dialog.dismiss();
Toast.makeText(MainActivity.this,"ssss",Toast.LENGTH_SHORT).show();
}
}).show();
}