美文网首页
PopupWindow使用总结

PopupWindow使用总结

作者: 你永远读不懂的答案 | 来源:发表于2017-11-30 13:26 被阅读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中的位置和样式
    

    相关文章

      网友评论

          本文标题:PopupWindow使用总结

          本文链接:https://www.haomeiwen.com/subject/fshvbxtx.html