PopupWindow的使用和用ListView相关扩展
PopupWindow的使用
使用list实现对PopupWindow显示列表的扩展和达到可以滑动界面的效果
1、PopupWindow的使用
popupWindow,就是弹出一个窗口之意,通常实现的功能是要在点击某个按钮之后弹出一组选项框供用户选择,完成后续额逻辑业务,很显然PopupWindow是在点击事件后的回调来实现的。通常在页面的title是一个含有左右两个按钮和中间的标题,我们可以自定义复合控件事件对这样的组合空间进行复用。但PopupWindow并不是传统的View或ViewGroup,是一个独立于存在的视图对象。大致实现分为两个部分:
第一、创建一个View视图,也就是点击后弹出出现在客户端的视图View对象,通常由如下的代码来实现;
View view=LayoutInflater.from(context).inflate(R.layout.XXX,null);
上面中的view就是展现在用户的视图view,这里使用到了系统的布局加载器LayoutInflater对象的方法,布局自行定义。
第二、创建一个PopupWindow对象,这里要注意选择合适构造器来创建PopupWindow对象,我在这里选用下面的构造器:
public PopupWindow(View contentView, int width, int height, boolean focusable);
上面构造器含有四个参数,第一个是前面我们已经创建好的视图view,因为这个视图是要弹出的,没视图那就没得弹了,第二个和第三个分别是PopupWindow对象的宽度和高度。这个宽度和高度可以自由定义固定长度,但是要注意的是,如果选定了包含内容的这种布局测量模式,就要注意使用LayoutParams.wrap_content来确定,但这里就出现了问题,就是利用哪一个包下面的LayoutParams对象,必须要用WindowManager包下面的LayoutParams,否则会报错。第四个参数是选择是否可以被聚焦,通常也就选用可以聚焦true。代码如下:PopupWindow popwindow=new PopupWindow(contentView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);最后,我们要对PopupWindow要进行设置
popwindow.setBackgroundDrawable(new BitmapDrawable());
该设置为在外部点击后PopupWindow是否可以被弹回,也就是dismiss,很明显,如果点击了背景background之后不可以弹回的话,那是在丢人。我们这里选用了任意一个空参的BitmapDrawable可编辑的位图对象作为背景,当然根据业务需要,也可以选择别的背景图片。最后就是显示PopupWindow了,关于其显示有多种方式,这里选用popwindow.showAsDropDown(v);该方法是以DropDown的形式弹出,这个方法有多个重载的方法,可以查阅资料获取它们的用法。这里有个参数v,v其实是所点击的按钮视图。这个参数v是这么解释的:the view onwhich to pin the popup window,我理解为是window的头部标记,若有更好的解析,欢迎交流。
showPopWindow(v)方法如下展示;
private void showPopWindow(View v) { View contentView= LayoutInflater.from(this).inflate(R.layout.popwindow_layout,null); PopupWindow popwindow=new PopupWindow(contentView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT,true); popwindow.setFocusable(true); popwindow.setBackgroundDrawable(new BitmapDrawable()); contentView.findViewById(R.id.one).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"第一个选项",Toast.LENGTH_SHORT).show();} }); popwindow.showAsDropDown(v); }2、使用ListView对弹出的view进行扩展,这一点其实容易,只需要把记载View的布局文件中实现容器视图ListView即可。其实我们可以发现,在这样的PopupWindow中界面其实很简略,不过这样能够实现滑动的效果,也不算不是一种扩展。然后选择ArrayAdapter将数据解析适配成一个个视图对象传递到ListView中即可。实现的代码如下:
private void showAnotherPopWindow(View v) { View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.anotherpopwindow_layout,null); mlistView= (ListView) view .findViewById(R.id.listview); stringlist=new ArrayList<>(); for (int i = 1; i <=20; i++) { stringlist.add("选择 "+i); } PopupWindow myPopwindow=new PopupWindow(view,WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT,true); myPopwindow.setBackgroundDrawable(new BitmapDrawable()); myPopwindow.showAsDropDown(v); adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,stringlist); mlistView.setAdapter(adapter); }