Android自定義多功能樣式Dialog

最近業務需要Dialog,可以顯示圖標,或者標題,按鈕只顯示一個或者2個,為了適應需求自定義一個Dialog以滿足需求。效果如下:

帶圖片無標題的單個按鈕對話框
有標題不帶圖片的對話框

先定義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;

/**
* author:Administrator on 2016/12/16 16:01
* description:自定義dialog
* version:版本
*/

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("對于一個在北平住慣的人,像我,冬天要是不刮風,便覺得是奇跡;濟南的冬天是沒有風聲的。")
                .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();
}

顯示什么就設置什么 ~ 是不是很簡單?不過谷歌官方推薦使用DialogFragment去實現Dialog,因為DialogFragment有生命周期使用起來更加強大和方便,有機會再使用吧~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容