PopupWindow是对话框的一种,比AlertDialog更灵活。
AlertDialog是非阻塞的。
PopupWindow是阻塞的。
/** * */ package cn.popup; import android.app.Activity; import android.app.AlertDialog; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; public class TestAct extends Activity { private static final String TAG = TestAct.class.getName(); private int seconds = 0; TextView parentMessage = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); ViewGroup.LayoutParams ww = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); parentMessage = new TextView(this); parentMessage.setLayoutParams(ww); parentMessage.setText("简单的PopupWindow"); layout.addView(parentMessage); AlertDialog dialog = new AlertDialog.Builder(this).create(); dialog.setMessage("AlertDialog非阻塞的对话框"); dialog.show(); //todo: 直接调用PopupWindow对话框,死机,说明PopupWindow阻塞UI线程 和AlertDialog不同 // new Handler().post(new Runnable() { // @Override // public void run() { // //To change body of implemented methods use File | Settings | File Templates. // showPopupWindow(TestAct.this); // } // }); //todo:延后100毫秒,正常跳出PopupWindow对话框 new Handler().postDelayed(new Runnable() { @Override public void run() { //To change body of implemented methods use File | Settings | File Templates. showPopupWindow(TestAct.this); } }, 100); } private void showPopupWindow(Activity act) { ViewGroup.LayoutParams ww = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); LinearLayout layout = new LinearLayout(act); layout.setBackgroundColor(Color.BLUE); EditText input = new EditText(act); input.setLayoutParams(ww); input.setText("跳出PopupWindow,我创建的时候会阻塞UI线程"); layout.addView(input); final PopupWindow pw = new PopupWindow(layout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); pw.setOutsideTouchable(false); pw.update(); View v = act.getWindow().getDecorView();//decorView是window中的最顶层view pw.showAtLocation(v, Gravity.CENTER, 0, 0); } }