PopupWindow使用总结

导读:本文先简单介绍一下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中的位置和样式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容