使用这个,自定义AlertDialog在你手里都不是问题
2017-10-09 00:00
337 查看
摘要: android简单自定义各种样式的 AlertDialog
最近一直在搞自定义的AlertDialog,先贴一下图。
![](https://static.oschina.net/uploads/img/201710/09172354_JGR0.png)
![](https://static.oschina.net/uploads/img/201710/09172418_9Fez.png)
这几种都是自定义的AlertDialog,还支持从Service弹出。好了,话不多说,看使用方法:
是不是觉得简单好多,我们关心的只有,我们该关心的,至于其他的繁琐的东西,我们不关心好伐。
我们这里看一下是怎么写的,下面会贴出GitHub链接
CustomDialogBuilder.java
DialogInitConfig.java
好吧其实我也知道你们根本不会看这些代码的,我就是要贴出来。
这里贴GitHub链接 :https://github.com/xiaolei123/EasyFreamTest
The End
最近一直在搞自定义的AlertDialog,先贴一下图。
![](https://static.oschina.net/uploads/img/201710/09171933_xu2Z.png)
![](https://static.oschina.net/uploads/img/201710/09172354_JGR0.png)
![](https://static.oschina.net/uploads/img/201710/09172418_9Fez.png)
这几种都是自定义的AlertDialog,还支持从Service弹出。好了,话不多说,看使用方法:
CustomDialogBuilder.With(this)//上下文 .load(R.layout.dialog_loading)//自定义的布局文件 .setDimAmount(0.5f)//设置背景透明度 .setCancelable(true)//是否点击区域外隐藏 .setHeigh(DensityUtil.dip2px(this,100))//设置高度 .setWidth(DensityUtil.dip2px(this,100))//设置宽度 .setWidth(0.5f)//设置宽度,以屏幕宽度为基准,取百分比 .InitView(null)//初始化View .InitEvent(null)//初始化事件 .show();//显示
是不是觉得简单好多,我们关心的只有,我们该关心的,至于其他的繁琐的东西,我们不关心好伐。
我们这里看一下是怎么写的,下面会贴出GitHub链接
CustomDialogBuilder.java
import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.support.annotation.LayoutRes; import android.support.v4.app.FragmentActivity; import android.support.v7.app.AlertDialog; import com.xiaolei.easyfreamwork.R; import com.xiaolei.easyfreamwork.application.ApplicationBreage; import com.xiaolei.easyfreamwork.utils.Log; /** * Created by xiaolei on 2017/10/9. */ public class CustomDialogBuilder { private boolean isBackNet = false; private AlertDialog.Builder builder; private Context context; private CustomDialogBuilder(Context context) { this.context = context; if (Activity.class.isInstance(context) || FragmentActivity.class.isInstance(context)) { if ((Activity.class.isInstance(context) && !((Activity) context).isFinishing()) || (FragmentActivity.class.isInstance(context) && !((FragmentActivity) context).isFinishing())) { builder = new AlertDialog.Builder(context); } else { Log.e("LOG", "不是activity,或者activity已关闭"); } } else { builder = new AlertDialog.Builder(ApplicationBreage.getInstance().getContext(), R.style.Base_Theme_AppCompat_Light_Dialog); isBackNet = true; } } public static CustomDialogBuilder With(Activity activity) { return new CustomDialogBuilder(activity); } public static CustomDialogBuilder With(FragmentActivity activity) { return new CustomDialogBuilder(activity); } public static CustomDialogBuilder With(Fragment fragment) { return new CustomDialogBuilder(fragment.getActivity()); } public static CustomDialogBuilder With(android.support.v4.app.Fragment fragment) { return new CustomDialogBuilder(fragment.getActivity()); } public static CustomDialogBuilder With(Context context) { return new CustomDialogBuilder(context); } /** * 加载布局文件 * * @param layout */ public DialogInitConfig load(@LayoutRes int layout) { return new DialogInitConfig(layout,builder,isBackNet,context); } public Context getContext() { return context; } }
DialogInitConfig.java
import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.support.annotation.FloatRange; import android.support.annotation.LayoutRes; import android.support.v7.app.AlertDialog; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; /** * * Created by xiaolei on 2017/10/9. */ public class DialogInitConfig { private DialogInitCallBack initCallBack; private DialogEventCallBack eventCallBack; private int width = -1, heigh = -1; private float dimAmount = 0f; @LayoutRes private int layout = -1; private AlertDialog.Builder builder; private boolean isBackNet = false; private boolean cancelable = true; private Context context; public DialogInitConfig(@LayoutRes int layout, AlertDialog.Builder builder, boolean isBackNet, Context context) { this.layout = layout; this.builder = builder; this.isBackNet = isBackNet; this.context = context; } /** * 获取上下文 * @return */ public Context getContext() { return context; } /** * 初始化UI * @param callBack * @return */ public DialogInitConfig InitView(DialogInitCallBack callBack) { initCallBack = callBack; return this; } /** * 初始化事件 * @param callBack * @return */ public DialogInitConfig InitEvent(DialogEventCallBack callBack) { eventCallBack = callBack; return this; } /** * 设置宽度,绝对的值 * @param width * @return */ public DialogInitConfig setWidth(int width) { this.width = width; return this; } /** * 设置宽度,屏幕的百分比的 * @param widthPercent * @return */ public DialogInitConfig setWidth(@FloatRange(from = 0.0,to = 1.0) double widthPercent) { WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); this.width = (int) (wm.getDefaultDisplay().getWidth() * widthPercent); return this; } /** * 设置高度 * @param heigh * @return */ public DialogInitConfig setHeigh(int heigh) { this.heigh = heigh; return this; } /** * 设置背景透明度 * @param dimAmount * @return */ public DialogInitConfig setDimAmount(@FloatRange(from = 0.0,to = 1.0) float dimAmount) { this.dimAmount = dimAmount; return this; } /** * 设置是否可以点击侧边取消 * @param cancelable * @return */ public DialogInitConfig setCancelable(boolean cancelable) { this.cancelable = cancelable; return this; } /** * 显示出来 * @return 返回一个dialog,方便dismiss */ public AlertDialog show() { if (builder == null) { return null; } builder.setTitle(""); builder.setMessage(""); builder.setCancelable(cancelable); AlertDialog alertDialog = builder.create(); if (alertDialog == null) { return null; } Window window = alertDialog.getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); // 去除四角黑色背景 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); if (isBackNet) { window.setType(WindowManager.LayoutParams.TYPE_TOAST); } window.setAttributes(params); } alertDialog.show(); try { View view = View.inflate(alertDialog.getContext(), layout, null); alertDialog.setContentView(view); if (initCallBack != null) { initCallBack.onInit(alertDialog, view); } if (eventCallBack != null) { eventCallBack.initEvent(alertDialog, view); } window = alertDialog.getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); window.setGravity(Gravity.CENTER); DisplayMetrics dm = new DisplayMetrics(); window.getWindowManager().getDefaultDisplay().getMetrics(dm); if (width != -1) { params.width = width; } if (heigh != -1) { params.height = heigh; } // 设置周围的暗色系数 params.dimAmount = dimAmount; window.setAttributes(params); } } catch (Exception e) { e.printStackTrace(); } return alertDialog; } public interface DialogInitCallBack { public void onInit(AlertDialog alertDialog, View view); } public interface DialogEventCallBack { public void initEvent(AlertDialog alertDialog, View view); } }
好吧其实我也知道你们根本不会看这些代码的,我就是要贴出来。
这里贴GitHub链接 :https://github.com/xiaolei123/EasyFreamTest
The End
相关文章推荐
- 使用visio 提示此UML形状所在的绘图页不是UML模型图的一部分 请问这个问题怎么解决?
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- 在"Select top 2 * from news order by count"进行筛选时,如果count值有重复时,则筛选结果将不是2条记录,这个问题该怎么解决?
- WSS自定义字段问题:在 RenderPattern 中使用自定义属性
- 只要你的答案让我明白了如和使用Microsoft VisualC++6 但是我一点基础也没有。所以向大家请教 我想学习C语言 加分不是问题 还望得到大家的帮助 我一定把分数加到你满意为止
- 看了,容易被忽略的细节(1):config文件的使用 ,我也谈谈这个简单的问题
- Html使用自定义光标的一点需要注意的小问题。
- 使用C++Builder创建自定义VCL组件时的一些问题
- Asp.Net连接ACCESS数据库相对路径问题,web.config中如何使用相对路径及在类文件中调用这个相对路径
- 使用VS 2005 在SQL Server 2005 中创建自定义函数 UDF 时发生的问题
- Asp.net生成Excel文件并下载(解决使用迅雷下载页面而不是文件的问题)
- 解决SharePoint中自定义新增和编辑List的页面时"增加附件"工作栏不能使用的问题
- 关于这个blog使用的问题?
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。”的问题
- 在使用 srping 的定时器时碰到了这个问题,正在找解决办法
- 在自定义Sharepoint Webpart中使用Linq的问题
- 今天开始使用这个blog来记录我的学习中遇到的问题吧
- [SharePoint2007]使用自定义数据库的几个问题
- 【原】Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- 使用JWebUnit应注意的2个问题,并不是所有的网站都适合用JWebUnit的!