相对于AlertDialog的使用,PopupWindow的使用也比较简单,这里主要介绍的是PopupWindow的基础使用包括在使用过程中的一些注意事项,做个笔记。
效果展示:
PopupWindow的基础方法
创建popupWindow实例
popupView = LayoutInflater.from(this).inflate(R.layout.popupwindow_view, null)
popupWindow = PopupWindow()
设置展示的视图
// 设置PopupWindow装载的视图
// 也可以在创建popupWindow的时候直接设置进去
popupWindow?.contentView = popupView
设置宽度和高度
// 设置PopupWindow的宽高
// 1》自定义View的时候,最外层的布局设置的宽高无效
// 2》在外面必须手动设置宽度和高度,并且以外面设置的宽高为主
popupWindow?.width = ViewGroup.LayoutParams.WRAP_CONTENT
popupWindow?.height = ViewGroup.LayoutParams.WRAP_CONTENT
设置外部区域可以点击取消popupWindow
// 设置外部区域可以点击取消popupWindow
popupWindow?.isOutsideTouchable = true
设置背景
// 设置PopupWindow的背景
// popupWindow?.setBackgroundDrawable(resources.getDrawable(R.mipmap.ic_launcher))
设置popupWindow是否可以聚焦
// 设置PopupWindow可以聚焦
// 如果不设置,在PopupWindow弹出的时候,点击返回键将直接退出Activity
// 设置之后,在PopupWindow弹出的时候,点击返回键不会直接退出Activity而是关闭当前弹出的PopupWindow
popupWindow?.isFocusable = true
设置弹窗弹出的动画高度
// 设置弹窗弹出的动画高度
popupWindow?.elevation = 100f
设置popupWindow是否可以触摸
// 设置PopupWindow可以触摸
popupWindow?.isTouchable = true
设置触摸监听
// 设置触摸监听
popupWindow?.setTouchInterceptor {
_, _ ->
Toast.makeText(this,"触发事件",Toast.LENGTH_SHORT).show()
false
}
设置取消事件监听
// 设置PopupWindow监听取消事件
popupWindow?.setOnDismissListener {
Toast.makeText(this,"PopupWindow被关闭",Toast.LENGTH_SHORT).show()
}
PopupWindow的展示
方式一:
// 方法一:showAsDropDown(View anchor)
// showAsDropDown(View anchor, int xoff, int yoff)
// showAsDropDown(View anchor, int xoff, int yoff, int gravity)
// anchor代表的是目标View,即参考的View
// xoff,yoff 目标View的坐标偏移量
// int gravity 目标View的位置,默认为Gravity.TOP | Gravity.START,即以左上角为起始位置
popupWindow?.showAsDropDown(view,0,0, Gravity.BOTTOM)
方式二:
// 方法二:showAtLocation(View parent, int gravity, int x, int y)
// View parent代表的是要能获取到window唯一标示的(也就是只要能获取到window 标示,view是什么控件都可以)
// int gravity代表的是位置,即屏幕的上下左右,注意系统默认都是在屏幕中间
// int x, int y偏移量
popupWindow?.showAtLocation(view, Gravity.TOP, 0, 0)
当然,在实际的开发过程中我们并不能仅仅满足于如何简单使用,更多的时候我们需要去考虑兼容性与扩展性的问题,所以,在这里,我对PopupWindow做了一个简单的封装,如下所示: