导读:本文先简单介绍一下popupwindow的简单使用,然后通过一个例子来记录Popupwindow+RecyclerView实现可滑动的弹窗。基本上这个会了就能满足日常的大部分需求。最后会总结下使用过程中遇到的坑。纯属自己记录下学习,不喜勿喷哈哈。
1、popupwindow的简单介绍:
popupwindow是一种弹窗形式的控件,他是浮动在屏幕顶部的,里面可以是任意的View。相对于Dialog来说,popupwindow可以指定展示在任意位置和大小。
2、popupwindow的使用:
popupwindow的使用大体分两步完成:
第一步,实例化一个PopupWindow 的对象;new一个就行了!
第二步,通过对象调用展示的函数比如:showAsDropDown(View view)展示在某一个控件的下面,下面会讲这个方法;还有一个是展示在父布局的内的指定位置,showAtLocation();
首先:Popupwindow的构造方法有四个:
//方法一:publicPopupWindow (Context context) //传入一个上下文对象
//方法二:publicPopupWindow(View contentView) //传入Popupwindow的内容布局,展示哪个布局就传入哪个布局
//方法三:publicPopupWindow(View contentView,intwidth,intheight)//布局、宽度、高度
//方法四:publicPopupWindow(View contentView,int width,int height,boolean focusable) //布局、宽度、高度、焦点
展示函数两个:
showAsDropDown(View anchor)//相对于某个空间的下方,无偏移
showAsDropDown(View anchor,int xoff, int yoff) //相对某个控件的位置,有偏移;
xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,
正值是向下,负值是向上;
showAsDropDown(View anchor,int xoff, int yoff,int gravity) //就多了一个位置参数
showAtLocation(View parent, int gravity, int x, int y) //相对于父控件的位置
(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
其他几个函数:(写完例子会挨个去尝试下)
public void dismiss() //隐藏popupwindow
public void setFocusable(boolean focusable) //该函数的意义表示,PopupWindow是否
具有 获取焦点的能力,默认为False。一般来讲是没有用的,因为普通的控件 是不需要获取焦点的,
而对于EditText则不同,如果不能获取焦点,那么EditText将是无法编辑的。
public void setTouchable(boolean touchable) //设置PopupWindow是否响应touch事件,
默认是true,如果设置为false,(所有touch事件无响应,包括点击事件)
public void setOutsideTouchable(boolean touchable) //这个方法意思是:
PopupWindow以外的区域是否可点击,即如果点击PopupWindow以外的区域,
PopupWindow是否会消失。
public void setBackgroundDrawable(Drawable background) // 这个函数不只能设置背景,后面会详细讲解
实例化popupwindow对象以后,可以在构造方法中指定View、width、height,也可以通过方法进行设置如下:
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popuplayout, null);
PopupWindwo popWnd = PopupWindow (context);
popWnd.setContentView(contentView);
popWnd.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popWnd.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
其中:contentView 和 width 和 height 是必须设置的不然不会出现任何视图-------
所以用两种方式初始化popupwindow都可以,顺序是,创建popupwindow对象,设置布局、宽、高
然后调用showAsDropDown()或者showAtLocation()方法把popupwindow显示出来,就这么简单
3、实例:popupwindow+RecyclerView实现以一个底部弹出的选择器
1、创建一个Activity的布局,里面只有一个Button,用来弹出这个popupwindow。代码就不写了,没啥好写的。
2、创建popupwindow的布局popup_layout ;里面只有一个RecyclerView如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
3、开始编写Button的点击事件。在监听事件中编写具体弹出popupwindow的方法,我们创建一个方法showPopupWindow(),在Button的onclick中调用:
//展示Popupwindow的方法
private void showPopupWindow() {
//popuwindow 展示的布局
View contentView; contentView=LayoutInflater.from(this).inflate(R.layout.popup_layout,null);
View view=LayoutInflater.from(this).inflate(R.layout.activity_main,null);//popupwindow的父布局
//通过构造方法实例化popupwindow,传入要显示的布局、定义宽高、和是否获取焦点
PopupWindow popupWindow=new PopupWindow(contentView,
ViewGroup.LayoutParams.MATCH_PARENT,
400,true);
//创建RecyclerView的适配器
PopupListAdapter adapter=new PopupListAdapter(this,data);
LinearLayoutManager manager=new LinearLayoutManager(this);
RecyclerView recyclerView=contentView.findViewById(R.id.recycler);
recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(adapter);
popupWindow.setBackgroundDrawable(new BitmapDrawable());
setBackgroundAlpha(0.5f);//设置屏幕透明度
popupWindow.showAtLocation(view,Gravity.BOTTOM,0,0);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
// popupWindow隐藏时恢复屏幕正常透明度
setBackgroundAlpha(1.0f);
}
});
}
/**
* 设置添加屏幕的背景透明度
*
* @param bgAlpha
* 屏幕透明度0.0-1.0 1表示完全不透明
*/
public void setBackgroundAlpha(float bgAlpha) {
WindowManager.LayoutParams lp = this.getWindow()
.getAttributes();
lp.alpha = bgAlpha;
this.getWindow().setAttributes(lp);
}
4、基本上这样就能实现了底部弹出,背景半透明的 选择器。 至于显示成什么样子,自己去写里面RecyclerView的布局就可以,然后处理相应的点击事件,这里只是展示了怎么去显示。
有个注意事项:RecyclerView的adapter中加载要显示的布局的时候,要用以下形式:
LayoutInflater.from(mContext).inflate(R.layout.popup_item,parent,false)
因为如果使用
LayoutInflater.from(mContext).inflate(R.layout.popup_item,null);
会出现无法控制item在popupwindow中的位置和样式