PopupWindow使用总结

2017-11-30  本文已影响0人  你永远读不懂的答案

导读:本文先简单介绍一下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中的位置和样式
上一篇下一篇

猜你喜欢

热点阅读