相信很多初学者把Toast、Dialog、menu用的是溜溜的,但有些时候想要华丽,炫酷的显示这些小控件时,感觉就有些麻烦了。积极主义者:麻烦就麻烦吧,自己定义;另一种:这原生的不是挺好的吗,用起来很方便。
其实只要你认识了PopupWindow,你马上就会被他征服,从此迷上了他,功能太强了,哪里都用得到,上手简单。下面就让我们使用PopupWindow定义初自己的炫酷,多彩的小控件吧!
1.使用PopupWindow自定义menu
特点:神出鬼没,想在哪里显示就在哪里显示,想要什么样式就什么样式。
首先把他的样式定下来,自己写个布局menu_popupmenu_change.xml。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/popuple_window">
<LinearLayout
android:layout_width="140dp"
android:layout_height="130dp"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/math"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数学"
android:layout_marginTop="15dp"
android:layout_gravity="center_horizontal"
android:textSize="15sp"
android:textColor="#3391e8"/>
<TextView
android:id="@+id/physics"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="物理"
android:layout_marginTop="20dp"
android:textSize="15sp"
android:textColor="#3391e8"/>
<TextView
android:id="@+id/chemistry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="化学"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:textSize="15sp"
android:textColor="#3391e8"/>
</LinearLayout>
然后就可以把布局添加到PopupWindow,在你要显示的地方写如下
View view = LayoutInflater.from(this).inflate(R.layout.menu_popupmenu_window,null);
TextView normal= (TextView) view.findViewById(R.id.math);
TextView plant= (TextView) view.findViewById(R.id.physics);
TextView frame= (TextView)
view.findViewById(R.id.chemistry);
normal.setOnClickListener(this);
plant.setOnClickListener(this);
frame.setOnClickListener(this);
popupWindow=new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT, true);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
popupWindow.showAtLocation(view, Gravity.CENTER,0,0);
可以看到我们只要把布局加载到view中,在创建PopupWindow,直接把view给他,这样就OK了,当然要显示的话,还要再加上showAtLocation()这个方法,第一个参数表示他相对哪个父控件,第二个参数表示在父控件的什么位置显示(我是显示在居中,其他的大家也都懂了),第三和第四个参数表示X、Y方向偏移,可以为负,方向与手机相对坐标相同(左上(0,0));这样就可以在手机的中间显示出一个menu样式的弹窗了。
注意:一定要加上setBackgroundDrawable(),不然这个弹窗就不会消失了,即使是按下Back键。
2.让他显示在指定控件的附近
特点:同上
首先还是自定义布局样式,代码就不贴了最后看效果图(样式就是让大家自己定义,没必要贴出来,而且我也是简单定义的,很丑,看看就好)
然后在你要显示的位置写上如下代码
View view = LayoutInflater.from(this).inflate(R.layout.menu_popupmenu_change,null);
TextView normal= (TextView) view.findViewById(R.id.math);
TextView plant= (TextView) view.findViewById(R.id.physics);
TextView frame= (TextView) view.findViewById(R.id.chemistry);
normal.setOnClickListener(this);
plant.setOnClickListener(this);
frame.setOnClickListener(this);
popupWindow=new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT, true);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
popupWindow.showAsDropDown(bt2,0,30);
可以看到基本和上面一样一样的,就是在显示方法上不一样了用的是showAsDropDown();意思大家也都懂了,就是在指定控件的下方;当然通过改变第二和第三个参数,就可以在上下左右任意位置显示了。注意点也和上面一样别忘了setBackgroundDrawable();
3.PopupWindow的方法介绍
构造方法:
1. public PopupWindow(View contentView, int width, int height, boolean focusable)
2. public PopupWindow (Context context)
常用第一个构造方法啦,直接可以指定大小;
当然你要用第二种方法也可但是必须要设置宽高setWidth(LayoutParams.WRAP_CONTENT);
setHeight(LayoutParams.WRAP_CONTENT);
显示方法:
1. showAsDropDown(View anchor):相对某个控件正左下方
2. showAsDropDown(View anchor, int xoff, int yoff):相对某个控件,可设置偏移
3. showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可设置偏移
焦点设置:
setFocusable(true);
这个如果设置成false ,PopupWindow就只是显示出来,没有响应事件。默认的是true;
设置动画:setAnimationStyle(R.style.xxxx);
点击空白消失:setOutsideTouchable(true),这个貌似没用,只要设置setBackgroundDrawable()就OK了;当然要点击到PopupWindow后消失,还要配合dismiss()才会消失;
4.介绍这么多,应该可以帮助大家解决大部分问题的。当然了PopupWindow的功能远远不止这些,这就要看大家的脑洞有多大了,就像我上篇定滑动删除时,就用的PopupWindow。当然他还有个兄弟PopupMenu有兴趣的可以看下,功能没有PopupWindow强大,不然也对不起“百变星君”的称号。
看下效果图:本来不想贴的,样式太丑。没办法,你知道有种病叫:自恋综合症。
大家如果有什么疑问的可以留言,一起探讨学习啊,共同进步!