自定义Style

  1. <item name="android:windowFrame">@null</item>
  2. <item name="android:windowNoTitle">true</item>
  3. <item name="android:windowBackground">@color/popup</item>
  4. <item name="android:windowIsFloating">true</item>
  5. <item name="android:windowContentOverlay">@null</item>
  6. </style>

在指定的位置显示

  1. //显示窗口
  2. window.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置

定义style

自定义Dialog:

  1. /**
  2. * 选择图片对话框
  3. * Created by chenlijin on 2016/4/12.
  4. public class SelectPicDialog extends Dialog {
  5. public SelectPicDialog(Context context, int themeResId) {
  6. super(context, themeResId);
  7. }
  8. @Override
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.dialog_select_pic);
  11. ButterKnife.bind(this);
  12. }
  13. @OnClick({R.id.linearlayout_out,R.id.textview_take_photo, R.id.textview_select_photo, R.id.textview_cancal})
  14. public void onClick(View view) {
  15. switch (view.getId()) {
  16. case R.id.textview_take_photo:
  17. if(listener!=null){
  18. listener.onClickTakePhoto();
  19. }
  20. this.cancel();
  21. break;
  22. if(listener!=null){
  23. listener.onClickSelectPic();
  24. this.cancel();
  25. break;
  26. case R.id.linearlayout_out:
  27. case R.id.textview_cancal:
  28. this.cancel();
  29. break;
  30. }
  31. }
  32. private OnWindowItemClickListener listener;
  33. public void setOnWindowItemClickListener(OnWindowItemClickListener listener) {
  34. this.listener = listener;
  35. }
  36. public interface OnWindowItemClickListener {
  37. void onClickTakePhoto();
  38. void onClickSelectPic();

(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。

(3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。

(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。

(6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。

注意: 这里讲的阻塞并非线程阻塞,而是阻塞了其他UI操作,详情见:PopupWindow的”阻塞”问题