PopupWindow和AlertDialog本质区别为:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。
以下是PopupWindow
public class MainActivity extends ActionBarActivity {
private RadioGroup rg;
private Button btn;
private Button btn_cancle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
final TextView tv_show=(TextView) findViewById(R.id.tv_show);
//按钮点击事件
btn.setOnClickListener(new OnClickListener() {
private PopupWindow pw;
@Override
public void onClick(View arg0) {
View contentView=View.inflate(MainActivity.this, R.layout.popu_layout, null);
rg = (RadioGroup) contentView.findViewById(R.id.rg);
btn_cancle = (Button) contentView.findViewById(R.id.btn_cancel);
//实例化PopupWindow
pw = new PopupWindow(contentView, 200, 200, true);
//设置PopupWindow的位置
pw.showAtLocation(btn, Gravity.CENTER, 0, 0);
//设置RadioGroup的选择事件
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
RadioButton rb_item=(RadioButton) rg.findViewById(arg0.getCheckedRadioButtonId());
tv_show.setText(rb_item.getText().toString());
}
});
//取消按钮事件
btn_cancle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//关闭PopupWindow窗口
pw.dismiss();
}
});
}
});
}