最近接了个需求,就是在某个时刻,给App弹一个自定义的弹窗。就是一张图加一段文字描述。感觉很简单,就直接接了下来。然后各种复制粘贴过后,这个弹窗也就大概做了出来,感觉再把从居中挪到右上角就可以了,然而就这一挪废了我将近一天的时间。感觉道路有些曲折,遂记录一下,以资来者。
首先创建一个自定义弹窗类,可以继承AlertDialog,也可以选择内部持有,为了好封装,我就选择内部持有来处理,内设一个show
的方法来展示弹窗。
核心代码
AlertDialog.Builder alertDialog = new AlertDialog.Builder(activity, R.style.Theme_AppCompat_Dialog);
View view = View.inflate(activity, R.layout.layout_dialog, null);
mDialog = alertDialog.setView(view).create();
// 设置弹窗不可以由back键控制
mDialog.setCancelable(false);
// 设置弹窗周围有灰色遮罩层,且点击遮罩层后能够触发onCancelListener监听
mDialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
mDialog.setCanceledOnTouchOutside(true);
// 设置弹窗位置为右上
WindowManager.LayoutParams params = mDialog.getWindow().getAttributes();
params.gravity = Gravity.RIGHT | Gravity.TOP;
mDialog.getWindow().setAttributes(params);
这个自定义弹窗需要注意这下面几个问题
- 为了更好的展示,最好将弹窗设置不可以由back键关闭,即
setCancelable(false)
。 - 为了让遮罩层能够点击成功,需要配置背景色为透明,且外部点击使能,即
setBackgroundDrawableResource(R.color.transparent)
,setCanceledOnTouchOutside(true)
。 - 设置弹窗位置,可以在layout中进行相应的距离数值数值,然后在代码中按照需求设置好上下左右,即
setAttributes(params)
。这块尝试过使用x、y进行设置,但是未生效; - 为了修改弹窗位置,也可以使用复写Dialog主题来解决,即声明一个新的style来创建dialog,但是不知道为啥我只能实现到靠一侧,无法实现靠一个角。
<style name="new_dilaog" parent="ThemeOverlay.AppCompat.Dialog.Alert">
<item name="android:windowBackground">@null</item>
</style>
参看代码:CustomDialog