自定义popupwindow(继承控件)
xml布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical"> <LinearLayout android:id="@+id/pop_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@android:color/transparent" android:gravity="center_horizontal" android:orientation="vertical" android:paddingTop="30dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@drawable/popwindow_photo" android:orientation="vertical"> <TextView android:id="@+id/tv_take_photo" android:layout_width="fill_parent" android:layout_height="45dp" android:gravity="center" android:text="拍照" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="#797979" /> <TextView android:id="@+id/tv_pick_photo" android:layout_width="fill_parent" android:layout_height="45dp" android:gravity="center" android:text="从相册选择" /> </LinearLayout> <TextView android:id="@+id/tv_cancel" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_margin="20dp" android:background="@drawable/popwindow_photo" android:gravity="center" android:text="取消" /> </LinearLayout> </RelativeLayout>
新建一个类,继承popupwindow,在其内部添加各种方法用以对其进行相应的操作。
public class SelectPicPopupWindow extends PopupWindow { private TextView tv_take_photo, tv_pick_photo, tv_cancel; private View mMenuView; public SelectPicPopupWindow(Activity context, OnClickListener itemsOnClick) { super(context); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); mMenuView = inflater.inflate(R.layout.popwindow_photo, null); tv_take_photo = (TextView) mMenuView.findViewById(R.id.tv_take_photo); tv_pick_photo = (TextView) mMenuView.findViewById(R.id.tv_pick_photo); tv_cancel = (TextView) mMenuView.findViewById(R.id.tv_cancel); //取消按钮 tv_cancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { //销毁弹出框 dismiss(); } }); //设置按钮监听 tv_pick_photo.setOnClickListener(itemsOnClick); tv_take_photo.setOnClickListener(itemsOnClick); //设置SelectPicPopupWindow的View this.setContentView(mMenuView); //设置SelectPicPopupWindow弹出窗体可点击 this.setFocusable(true); //设置SelectPicPopupWindow弹出窗体动画效果 this.setAnimationStyle(R.style.AnimBottom); //实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0xb0000000); //设置SelectPicPopupWindow弹出窗体的背景 this.setBackgroundDrawable(dw); //mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框 mMenuView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int height = mMenuView.findViewById(R.id.pop_layout).getTop(); int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_UP) { if (y < height) { dismiss(); } } return true; } }); } public SelectPicPopupWindow setPopWindowHight(int height) { //设置SelectPicPopupWindow弹出窗体的高 this.setHeight(height); return this; } public SelectPicPopupWindow setPopWindowWidth(int width) { //设置SelectPicPopupWindow弹出窗体的宽 this.setWidth(width); return this; } }使用时,只需在布局中include引入popupwindow的布局文件。
在Activity中使用步骤如下
//实例化SelectPicPopupWindow menuWindow = new SelectPicPopupWindow(this, itemsOnClick); // 设置popwindow的宽高 menuWindow.setPopWindowHight(410).setPopWindowWidth(ActionBar.LayoutParams.MATCH_PARENT); //显示窗口 menuWindow.showAtLocation(this.findViewById(R.id.main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置设置popupwindow的监听
//为弹出窗口实现监听类 private View.OnClickListener itemsOnClick = new View.OnClickListener() { public void onClick(View v) { menuWindow.dismiss(); switch (v.getId()) { case R.id.tv_take_photo: break; case R.id.tv_pick_photo: break; default: break; } } };
更加深入细致的操作可在SelectPicPopupWindow中去进行添加。