android:自定义Dialog(通用)

自定义Dialog是一个非常常见的需求,Dialog上可以显示图标,或者标题,显示1个或者2个两个按钮。

效果如下:

image.png
image.png

先定义Dialog样式:

<style name="CustomDialog" parent="android:style/Theme.Dialog">    
      <!--背景颜色及和透明程度-->    
      <item name="android:windowBackground">@android:color/transparent</item>    
      <!--是否去除标题 -->    
      <item name="android:windowNoTitle">true</item>    
      <!--是否去除边框-->    
      <item name="android:windowFrame">@null</item>    
      <!--是否浮现在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 ;

/**
 * 显示的标题
 */
private TextView titleTv ;

/**
 * 显示的消息
 */
private TextView messageTv ;

/**
 * 确认和取消按钮
 */
private Button negtiveBn ,positiveBn;

/**
 * 按钮之间的分割线
 */
private View columnLineView ;
public CommonDialog(Context context) {
    super(context, R.style.CustomDialog);
}

/**
 * 都是内容数据
 */
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();
    //初始化界面数据
    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();
            }
        }
    });
}

/**
 * 初始化界面控件的显示数据
 */
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){
        imageIv.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);
}

/**
 * 设置确定取消按钮的回调
 */
public OnClickBottomListener onClickBottomListener;
public CommonDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
    this.onClickBottomListener = onClickBottomListener;
    return this;
}
public interface OnClickBottomListener{
    /**
     * 点击确定按钮事件
     */
    public void onPositiveClick();
    /**
     * 点击取消按钮事件
     */
    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("系统提示")
                .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();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 圣诞节。 令千佑与同学和韦爷的千金韦以柔去芬兰度假,令烈、令熹也带着令老太去了马尔代夫。一来没有过圣诞的习惯,二来...
    籽盐阅读 470评论 0 1
  • 半年前,我P了下面这张图。那天是我开通微信公众号的第一天,从此我义务反顾地决定要投身“公号狗”之列。 其实,我已然...
    七月狐狸阅读 617评论 1 1