Android提供兩種對話框形式,一種是popupwindow,一種是dialog,先爲大家說明一下兩者的區別。
位置:AlertDialog的位置固定,而PopupWindow的位置可以隨意。
showAsDropDown(View anchor):相對某個控件的位置(正左下方),無偏移。
showAsDropDown(View anchor, int xoff, int yoff):相對某個控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相對於父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設置偏移或無偏移
線程:AlertDialog是非阻塞線程的,而PopupWindow是阻塞線程的。
第一個案例
講解一下重要的代碼部分,稍後我會講源碼發出去供大家下載。
簡單的案例,大家先看一下代碼
public class MyPopupWindow extends PopupWindow {
private Button btn_take_photo, btn_pick_photo, btn_cancel;
private View mMenuView;
public MyPopupWindow(Activity context, OnClickListener itemsOnClick) {
super(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mMenuView = inflater.inflate(R.layout.alert_dialog, null);
btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);
btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);
btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
//取消按鈕
btn_cancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//銷燬彈出框
dismiss();
}
});
//設置按鈕監聽
btn_pick_photo.setOnClickListener(itemsOnClick);
btn_take_photo.setOnClickListener(itemsOnClick);
this.setContentView(mMenuView);
this.setWidth(LayoutParams.FILL_PARENT);
this.setHeight(LayoutParams.WRAP_CONTENT);
this.setFocusable(true);
this.setTouchable(true);
this.setAnimationStyle(R.style.PopupAnimation);
ColorDrawable dw = new ColorDrawable(Color.TRANSPARENT);
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;
}
});
}
}
看一下MainActivity的實現
public class MainActivity extends Activity {
//自定義的彈出框類
MyPopupWindow menuWindow;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv = (TextView) this.findViewById(R.id.text);
//把文字控件添加監聽,點擊彈出自定義窗口
tv.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
menuWindow = new MyPopupWindow(MainActivity.this,itemsOnClick);
//顯示窗口
menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //設置layout在PopupWindow中顯示的位置
}
});
}
//爲彈出窗口實現監聽類
private OnClickListener itemsOnClick = new OnClickListener() {
public void onClick(View v) {
menuWindow.dismiss();
switch (v.getId()) {
case R.id.btn_take_photo:
break;
case R.id.btn_pick_photo:
break;
default:
break;
}
}
};
}
第二個案例
①.如上圖所示在構造PopupWindow的實例時,制定它的寬度是button的寬度,如下代碼
PopupWindow popu = new PopupWindow(mPopup, btn.getWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
②.點擊外部時,當前PopupWindow就消失,如下代碼
popu.setOutsideTouchable(true);
③.設置PopupWindow可以獲取焦點
popu.setFocusable(true);
④.調用顯示位置的showAtLocation方法
int[] location = new int[2];
btn.getLocationOnScreen(location);
popu.showAtLocation(btn, Gravity.NO_GRAVITY, location[0], location[1] + btn.getHeight());
下載Demo請猛戳第三個案例
關鍵是在ListView的Adapter中對popupwindow的處理
在構建Adapter實例的時候,初始化popupwindow,並顯示
/**
* 初始化popWindow
* */
private void initPopWindow() {
View popView = inflater.inflate(R.layout.listview_pop, null);
popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable(0));
//設置popwindow出現和消失動畫
popupWindow.setAnimationStyle(R.style.PopMenuAnimation);
btn_pop_close = (ImageView) popView.findViewById(R.id.btn_pop_close);
}
/**
* 顯示popWindow
* */
public void showPop(View parent, int x, int y, int postion) {
//設置popwindow顯示位置
popupWindow.showAtLocation(parent, Gravity.AXIS_X_SHIFT, x, y);
//獲取popwindow焦點
popupWindow.setFocusable(true);
//設置popwindow如果點擊外面區域,便關閉。
popupWindow.setOutsideTouchable(true);
popupWindow.update();
if (popupWindow.isShowing()) {
popupWindow.dismiss();
}
btn_pop_close.setOnClickListener(new OnClickListener() {
public void onClick(View paramView) {
popupWindow.dismiss();
}
});
}
下載Demo請猛戳