Android自定义多功能样式Dialog
sapphire
8年前
<p>最近业务需要Dialog,可以显示图标,或者标题,按钮只显示一个或者2个,为了适应需求自定义一个Dialog以满足需求。效果如下:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/9b963f681c8cc5ba21b4a22a47043c3e.jpg"></p> <p>带图片无标题的单个按钮对话框</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/09e50feca60bacae83b62b11276cf1ec.jpg"></p> <p>有标题不带图片的对话框</p> <p>先定义Dialog样式:</p> <pre> <code class="language-java"><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></code></pre> <p>再去定义对话框的布局,首先来个圆角背景:</p> <pre> <code class="language-java"><?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></code></pre> <p>布局:</p> <pre> <code class="language-java"><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></code></pre> <p>最后送上Dialog源码,注释已经写得很清楚了,不用多解释了:</p> <pre> <code class="language-java">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 ; } }</code></pre> <p>好了,下面就是使用了:</p> <pre> <code class="language-java">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(); }</code></pre> <p>显示什么就设置什么 ~ 是不是很简单?不过谷歌官方推荐使用DialogFragment去实现Dialog,因为DialogFragment有生命周期使用起来更加强大和方便,有机会再使用吧~</p> <p> </p> <p>来自:http://www.jianshu.com/p/b48da813acf5</p> <p> </p>