PopupWindow仿菜单
程序功能:使用PopupWindow模仿window中菜单的功能,下面开始详细讲解。
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:background="#FFFFFF" > 6 7 <Button 8 android:id="@+id/popupBtn" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:layout_alignParentBottom="true" 12 android:layout_alignParentLeft="true" 13 android:background="#000000" 14 android:text="菜单" /> 15 16 </RelativeLayout>
Activity的布局文件很简单,就是一个Button。
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="wrap_content" 5 android:background="#000000" 6 android:orientation="vertical" > 7 8 <ListView 9 android:id="@+id/listView" 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content" > 12 </ListView> 13 14 </LinearLayout>
PopupWindow的布局文件也很简单,包含一个ListView。
1 private void init() { 2 // 获得PopupWindow中布局引用 3 View view = getLayoutInflater().inflate(R.layout.popupwindow, null); 4 listView = (ListView) view.findViewById(R.id.listView); 5 // 初始化 PopupWindow 6 pw = new PopupWindow(view, 280, 360, true); 7 btn = (Button) findViewById(R.id.popupBtn); 8 // 设置Adapter 9 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 10 android.R.layout.simple_list_item_1, data); 11 listView.setAdapter(adapter); 12 }
此函数用来初始化控件,其中构造PopupWindow传入了四个参数,第一个是布局文件的View,第二个是宽度,第三个是高度,第四个是此弹出框是否可以获得焦点,如果是false的话,其中包含的控件都不会获得焦点,即用户点击不会有任何反应,true则反之。
1 private void setListener() { 2 listView.setOnItemClickListener(new OnItemClickListener() { 3 4 @Override 5 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 6 long arg3) { 7 8 switch (arg2) { 9 case NEW: 10 break; 11 case OPEN: 12 break; 13 case SAVE: 14 break; 15 case CANCEL: 16 pw.dismiss(); 17 break; 18 } 19 } 20 }); 21 22 btn.setOnClickListener(new OnClickListener() { 23 24 @Override 25 public void onClick(View v) { 26 pw.showAsDropDown(v, 5, 5); 27 } 28 }); 29 }
此函数负责给控件(Button,ListView)添加事件监听,其中pw.showAsDropDown(v, 5, 5); 是让弹出框与我们的Button相关联,并且x、y坐标上都偏移5的距离。为了简单起见,其中弹出的菜单中只给“取消”添加了行为,其他操作可以另行添加,下面给出完整代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class PopupActivity extends Activity { 2 3 private PopupWindow pw; 4 private Button btn; 5 private ListView listView; 6 private String[] data = { "新建", "打开", "保存", "取消" }; 7 8 private static final int NEW = 0; 9 private static final int OPEN = 1; 10 private static final int SAVE = 2; 11 private static final int CANCEL = 3; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.popup); 18 19 // 初始化控件 20 init(); 21 // 控件添加监听 22 setListener(); 23 } 24 25 /** 26 * 设置监听 27 */ 28 private void setListener() { 29 listView.setOnItemClickListener(new OnItemClickListener() { 30 31 @Override 32 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 33 long arg3) { 34 35 switch (arg2) { 36 case NEW: 37 break; 38 case OPEN: 39 break; 40 case SAVE: 41 break; 42 case CANCEL: 43 pw.dismiss(); 44 break; 45 } 46 } 47 }); 48 49 btn.setOnClickListener(new OnClickListener() { 50 51 @Override 52 public void onClick(View v) { 53 pw.showAsDropDown(v, 5, 5); 54 } 55 }); 56 } 57 58 /** 59 * 初始化 60 */ 61 private void init() { 62 // 获得PopupWindow中布局引用 63 View view = getLayoutInflater().inflate(R.layout.popupwindow, null); 64 listView = (ListView) view.findViewById(R.id.listView); 65 // 初始化 PopupWindow 66 pw = new PopupWindow(view, 280, 360, true); 67 btn = (Button) findViewById(R.id.popupBtn); 68 // 设置Adapter 69 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 70 android.R.layout.simple_list_item_1, data); 71 listView.setAdapter(adapter); 72 } 73 }
效果图如下: