PopupWindow选项弹窗
一、popupwindow弹窗简介
popupwindow是一种弹窗在应用中经常使用,像超级课程表的周数选择,微博的标题栏的titlebar中的选择等等 ,如图所示。
但是和alertDialog很相似,但是还是有很大的区别的。AlterDialog是非阻塞式对话框:AlaterDialog弹出时,后台还可以做事情;而且PopuWindow是阻塞式对话框:PopupWindow弹出时,后台程序会等待,在PopupWindow退出之前一直处于等待,直到当我们调用了dismiss方法之后,PopuWindow退出了,程序才会向下执行。
二、PopupWindow的使用
1、构造一个PopupWindow对象。PopupWindow pop = new PopupWindow(view,300, 250);
View是加载的布局文件View view = layoutInflater.inflate(R.layout.grou_list, null);
X,Y是PopupWindow弹窗的长和宽
View是点击弹出PopupWindow的View x,y是设定PopupWindow弹出的位置
3、Dismiss()方法设置PopupWindow的消失。
4、还有几个常用的设置方法。
setFocusable(true)设置使PopupWindow聚焦
setOutsideTouchable(true)设置允许点击外部的地方消失
setBackgroundDrawable(new BitmapDrawable())设置点击返回键也能使其消失。
三、例子实现
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
public class MainActivity extends Activity
{
private TextView
tv_pop;
private ListView
group_list;
private TextView
tv_group_item;
private View
view;
private PopupWindow
pop;
private List<String>
list;
protected void onCreate(Bundle
savedInstanceState) {
super .onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.activity_main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.title);
tv_pop
= (TextView) findViewById(R.id.tv_pop);
tv_group_item
= (TextView) findViewById(R.id.tv_group_item);
tv_pop.setText( "学期" );
tv_pop.setOnClickListener( new View.OnClickListener()
{
public void onClick(View
v) {
showWindow(v);
}
});
}
protected void showWindow(View
v) {
if (pop
== null )
{
LayoutInflater
layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//将listView的布局文件加载到View中
view
= layoutInflater.inflate(R.layout.grou_list, null );
group_list=(ListView)
view.findViewById(R.id.group_list);
//List数组
list
= new ArrayList<String>();
list.add( "2012-2013学年第1学期" );
list.add( "2012-2013学年第2学期" );
list.add( "2013-2014学年第1学期" );
list.add( "2013-2014学年第2学期" );
GroupAdapter
groupAdapter = new GroupAdapter( this ,
list);
group_list.setAdapter(groupAdapter);
//
pop
= new PopupWindow(view, 300 , 250 );
}
//
使其得到聚焦
pop.setFocusable( true );
//
设置允许点击外部的地方消失
pop.setOutsideTouchable( true );
//
设置点击返回键也能使其消失,并且不会影响你的背景
pop.setBackgroundDrawable( new BitmapDrawable());
//获取屏幕的宽度,计算弹窗弹出位置的x坐标
WindowManager
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
int xPos
= windowManager.getDefaultDisplay().getWidth() / 2
-
pop.getWidth() / 2 ;
//设置弹窗弹出的位置
pop.showAsDropDown(v,
- 100 , 0 );
//
pop.showAtLocation(v, Gravity.TOP, 0,45);
//设置List点击后的点击事件
group_list.setOnItemClickListener( new OnItemClickListener()
{
public void onItemClick(AdapterView<?>
adapterView, View viewe,
int position, long id)
{
Toast.makeText(MainActivity. this ,
list.get(position),
Toast.LENGTH_SHORT).show();
if (pop
!= null )
{
pop.dismiss();
}
}
});
}
}
|
GroupAdapter:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
public class GroupAdapter extends BaseAdapter
{
private Context
context;
private List<String>
list;
public GroupAdapter(Context
context, List<String> list) {
this .context
= context;
this .list
= list;
}
public int getCount()
{
return list.size();
}
public Object
getItem( int position)
{
return list.get(position);
}
public long getItemId( int position)
{
return position;
}
public View
getView( int position,
View convertView, ViewGroup parent) {
ViewHolder
holder;
if (convertView
== null )
{
convertView
= LayoutInflater.from(context).inflate(
R.layout.group_item, null );
holder
= new ViewHolder();
convertView.setTag(holder);
holder.groupItem
= (TextView) convertView
.findViewById(R.id.tv_group_item);
} else {
holder
= (ViewHolder) convertView.getTag();
}
holder.groupItem.setText(list.get(position));
return convertView;
}
static class ViewHolder
{
TextView
groupItem;
}
}
|
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
|
android:layout_width = "match_parent"
android:layout_height = "500dp"
android:background = "#D2D2D5"
android:orientation = "vertical" >
< Button
android:id = "@+id/bb"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "button" />
</ LinearLayout >
|
title.xml
自定义标题栏的标题栏的布局文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:background = "#E1E6F6" >
< TextView
android:id = "@+id/tv_pop"
android:layout_width = "wrap_content"
android:layout_height = "45dip"
android:layout_alignParentTop = "true"
android:layout_centerHorizontal = "true"
android:gravity = "center"
android:text = "学期"
android:textSize = "23dp" />
< ImageView
android:layout_width = "wrap_content"
android:layout_height = "44dip"
android:src = "@drawable/title_right" />
< ImageView
android:layout_width = "wrap_content"
android:layout_height = "fill_parent"
android:layout_alignParentRight = "true"
android:layout_alignParentTop = "true"
android:src = "@drawable/title_left" />
</ RelativeLayout >
|
group_list.xml
弹窗中的listview的布局文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<? xml version = "1.0" encoding = "utf-8" ?>
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical"
android:paddingLeft = "0.0sp"
android:paddingRight = "0.0sp"
android:layout_margin = "0.0px"
android:background = "@drawable/group_bg"
>
< ListView
android:id = "@+id/group_list"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:drawSelectorOnTop = "true"
android:cacheColorHint = "#00000000"
android:dividerHeight = "2.0px"
></ ListView >
</ LinearLayout >
|
group_item.xml
设置弹窗中ListView中加载的控件textview
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? xml version = "1.0" encoding = "utf-8" ?>
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical" >
< TextView
android:id = "@+id/tv_group_item"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:gravity = "center"
/>
</ LinearLayout >
|
效果图: