两者的区别

PopupWindow和AlertDialog最大的区别:

  • AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可以做其他事情(也即弹出对话框后程序会继续向下执行);
  • PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待,只有当我们调用了dismiss方法之后,PopupWindow退出,程序才会向下执行。
注意:当他们两个弹出或消失时,都不会调用Activity生命周期的任何方法

注:自定义对话框可以用builder.setView(View,view)设置!
注:官方不推荐直接使用Dialog创建对话框(推荐使用AlertDialog或DialogFragment),而我们公司用的对话框都是继承自Diaolog的。

控制显示位置

控制popupWindow显示位置的方法:

1、showAtLocation()显示在指定位置,有两个方法重载:
  • public void showAtLocation(View parent, int gravity, int x, int y)
        如showAtLocation(parent, Gravity.RIGHT | Gravity.BOTTOM, 10,10)
    • 第一个参数指定PopupWindow的锚点view,即依附在哪个view上。
    • 第二个参数指定起始点为parent的右下角
    • 第三、四个参数设置以parent的右下角为原点,向左、上各偏移10像素。
    • 如果没有充足的空间显示PopupWindow,那么PopupWindow将裁剪
  • public void showAtLocation(IBinder token, int gravity, int x, int y)
2、showAsDropDown()显示在一个参照物View的周围,有三个方法重载:
  • public void showAsDropDown(View anchor)
  • public void showAsDropDown(View anchor, int xoff, int yoff)
  • public void showAsDropDown(View anchor, int xoff, int yoff, int gravity)

以上两个方法的位移参数可以通过以下方法设置:

  • 具体的值
  • 通过view.getWidth()等方法获取控件大小
  • 通过view.getLocationOnScreen(location)方法将view在屏幕上的位置取出并存放在数组location中,进而获取位移

注意:如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框


控制对话框显示位置:
通过 dialog.getWindow() 获取对话框窗口对象,对此Window进行设置后再设置给dialog即可
只能对Dialog设置,对AlertDialog我还不知道怎么设置


dialog和pop演示布局


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    android:orientation="vertical" >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="dialog1"
        android:text="确定取消对话框" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="dialog2"
        android:text="单选对话框" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="dialog3"
        android:text="多选对话框" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="dialog4"
        android:text="进度条对话框" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="dialog5"
        android:text="带进度的进度条对话框" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="dialog6"
        android:text="自定义对话框显示位置" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="popup1"
        android:text="popup,出现在v的下方" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="popup2"
        android:text="popup,出现在任意位置" />

</LinearLayout>


dialog和pop演示代码

import android.content.DialogInterface.OnClickListener;

import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //确定取消对话框
    public void dialog1(View view) {
        AlertDialog.Builder builder = new Builder(this);//对话框的创建器
        builder.setTitle("我是对话框");
        builder.setMessage("对话框显示的内容");
        builder.setPositiveButton("确定", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                //参数:dialog-The dialog that received the click.;which-The button that was clicked 
                Toast.makeText(MainActivity.this, "确定被点击了", 0).show();
            }
        });
        builder.setNegativeButton("取消", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "取消被点击了", 0).show();
            }
        });
        builder.setCancelable(false);//是否能不做选择,默认为true
        builder.create().show();
    }
    //单选对话框
    public void dialog2(View view) {
        AlertDialog.Builder builder = new Builder(this);
        builder.setTitle("请选择您的性别");
        final String[] items = { "男", "女", "未知" };
        builder.setSingleChoiceItems(items, -1, new OnClickListener() {//指定选择的是哪个,-1代表默认没有选中
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "您的性别:" + items[which], 0).show();
                        dialog.dismiss();
                    }
                });
        builder.create().show();
    }
    //多选对话框
    public void dialog3(View view) {
        AlertDialog.Builder builder = new Builder(this);
        builder.setTitle("请选择你最爱吃的水果");
        final String[] items = { "苹果", "梨", "菠萝", "香蕉", "黄瓜" };
        final boolean[] result = new boolean[] { true, false, true, false, false };//对应条目默认是否被选中
        builder.setMultiChoiceItems(items, result, new OnMultiChoiceClickListener() {
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                String inf = "";
                if (isChecked) {
                    inf = " 被选中了";
                } else {
                    inf = " 被取消选中了";
                }
                Toast.makeText(MainActivity.this, items[which] + inf, 0).show();
                result[which] = isChecked;
            }
        });
        builder.setPositiveButton("提交", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < result.length; i++) {
                    if (result[i]) {
                        sb.append(items[i] + " ");
                    }
                }
                Toast.makeText(MainActivity.this, "您选中了:" + sb.toString(), 0).show();
            }
        });
        builder.create().show();
    }
    //进度条对话框
    public void dialog4(View view) {
        ProgressDialog pd = new ProgressDialog(this);//不需要创建器
        pd.setTitle("提醒");
        pd.setMessage("正在加载数据...请稍等。");
        pd.show();
    }
    //带进度的进度条对话框
    public void dialog5(View view) {
        final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("提醒");
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//当设置此属性的值后才会有进度显示
        pd.setMax(100);
        pd.setMessage("正在加载数据...请稍等。");
        pd.show();
        new Thread() {
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                    }
                    pd.setProgress(i);//改变当前进度
                }
                pd.dismiss();//当进度为100%时关闭对话框,可以在任意进程中关闭
            };
        }.start();
    }


    //自定义对话框显示位置-----不推荐!
    public void dialog6(View v) {
        Dialog dialog = new Dialog(this);
        dialog.setTitle("我是对话框");
        Window dialogWindow = dialog.getWindow(); // 获取对话框窗口对象
        WindowManager.LayoutParams mLayoutParams = dialogWindow.getAttributes();//获取对话框参数对象
        dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);//修改对话框的布局设置
        mLayoutParams.x = 10;// 表示相对于【原始位置】的偏移,当为Gravity.LEFT时就表示相对左边界的偏移,正值右移,负值忽略
        mLayoutParams.y = 100;//当为Gravity.BOTTOM时正值上移,负值忽略
        mLayoutParams.width = 10;//为啥根本就没用
        mLayoutParams.height = 80;
        mLayoutParams.alpha = 0.2f; // 透明度
        dialogWindow.setAttributes(mLayoutParams);
        dialog.show();
    }

    //弹出窗体,出现在v的下方
    public void popup1(View v) {
        TextView tv = new TextView(this);
        tv.setText("我是弹出窗体中的内容");
        tv.setTextColor(0xffff0000);
        tv.setGravity(Gravity.CENTER);
        tv.setBackgroundColor(0xff00ffff);
        PopupWindow popWin = new PopupWindow(tv, LayoutParams.WRAP_CONTENT, 100);
        popWin.setFocusable(true);
        popWin.setOutsideTouchable(true);
        popWin.setBackgroundDrawable(new ColorDrawable(0x00ff0000));//背景和上面的综合了,这行代码是必须要有的
        popWin.showAsDropDown(v);
    }
    //弹出窗体,出现在任意位置,值为负时会移出可视窗口
    public void popup2(View v) {
        TextView tv = new TextView(this);
        tv.setText("我是弹出窗体中的内容");
        tv.setTextColor(0xffff0000);
        tv.setGravity(Gravity.CENTER);
        tv.setBackgroundColor(0xff00ffff);
        PopupWindow popWin = new PopupWindow(tv, LayoutParams.WRAP_CONTENT, 100);
        popWin.setFocusable(true);
        popWin.setOutsideTouchable(true);
        popWin.setBackgroundDrawable(new ColorDrawable(0x00ff0000));//背景和上面的综合了,这行代码是必须要有的
        popWin.showAtLocation(v, Gravity.TOP | Gravity.RIGHT, 10, 100);
    }

}


Pop+ListView演示代码

public class MainActivity extends Activity {

    private EditText et_input;//输入框
    private ImageView iv_more;//点击弹出下拉窗口
    private PopupWindow popWin;
    private ListView listView;//弹出框PopupWindow中的View
    private List<String> mList;//listView中的数据
    private ViewHolder holder;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_input = (EditText) findViewById(R.id.et_input);
        iv_more = (ImageView) findViewById(R.id.iv_more);
        initListView();
        
        //弹出PopupWindow
        iv_more.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                popWin = new PopupWindow(listView, et_input.getWidth(), LayoutParams.WRAP_CONTENT);
                popWin.setBackgroundDrawable(new ColorDrawable(0x00888800));//背景根本没效果的!
                popWin.setOutsideTouchable(true); // 点击popWin 以处的区域,自动关闭 popWin
                popWin.showAsDropDown(et_input);//设置 弹出窗口显示的位置,这句代码必须放在最后,否则要么显示不出来要么有BUG
            }
        });
    }
    private void initListView() {
        mList = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            mList.add("工号为:0123456789" + i);
        }
        listView = new ListView(this);
        listView.setBackgroundResource(R.drawable.input); //背景图为一个9path图
        //listView.setDivider(new ColorDrawable(0xffff0000)); //设置条目之间的分隔线
        listView.setDivider(new ColorDrawable(getResources().getColor(R.color.red)));
        listView.setDividerHeight(1);//对应android:dividerHeight,代码中只能设置为int
        listView.setVerticalScrollBarEnabled(false); //不显示右侧的滚动条
        listView.setAdapter(new MyListAdapter());
    }
    private class MyListAdapter extends BaseAdapter {
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = View.inflate(getApplicationContext(), R.layout.item, null);
                holder = new ViewHolder();
                holder.tv_item_delete = (ImageView) convertView.findViewById(R.id.tv_item_delete);
                holder.tv_item_msg = (TextView) convertView.findViewById(R.id.tv_item_msg);
                convertView.setTag(holder);
            } else holder = (ViewHolder) convertView.getTag();
            holder.tv_item_msg.setText(mList.get(position));
            //设置View每个条目中删除图标的点击事件
            holder.tv_item_delete.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mList.remove(position);//删除此条目在数据源中的数据                  
                    notifyDataSetChanged();//内容改变时刷新listView
                }
            });
            //设置整个View的点击事件
            convertView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    et_input.setText(mList.get(position));
                    popWin.dismiss();
                }
            });
            return convertView;
        }
        @Override
        public int getCount() {
            return mList.size();
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
    }
    private class ViewHolder {
        TextView tv_item_msg;
        ImageView tv_item_delete;
    }

}


窗口 对话框 Pop Dialog 示例的更多相关文章

  1. 对话框--pop&dialog总结

    pinguo-zhouwei/CustomPopwindow:(通用PopupWindow,几行代码搞定PopupWindow弹窗(续)): 1,通用PopupWindow,几行代码搞定PopupWi ...

  2. 窗口-EasyUI Window 窗口、EasyUI Dialog 对话框、EasyUI Messager 消息框

    EasyUI Window 窗口 扩展自 $.fn.panel.defaults.通过 $.fn.window.defaults 重写默认的 defaults. 窗口(window)是一个浮动的.可拖 ...

  3. MFC中对话框类(Dialog)的应用

    转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...

  4. jQuery UI 实例 - 对话框(Dialog)(zhuan)

    http://www.runoob.com/jqueryui/example-dialog.html ************************************************* ...

  5. ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  6. jQuery UI 对话框(Dialog) - 模态表单

    <!doctype html><html lang="en"><head> <meta charset="utf-8" ...

  7. 关于Element对话框组件Dialog在使用时的一些问题及解决办法

    Element对话框组件Dialog在我们的实际项目开发中可以说是一个使用频率较高的组件,它能为我们展示提示的功能,如:业务模块提交前展示我们曾经输入或选择过的业务信息,或者展示列表信息中某项业务的具 ...

  8. window窗口-button(按钮)-dialog(对话框,带按钮)

    描述:一个可拖动的窗口程序,默认情况下窗口自由移动.调整大小.打开关闭! 案例1(普通的窗口): <div class="easyui-window" icon-Cls=&q ...

  9. android 8种对话框(Dialog)使用方法汇总

    1.写在前面 Android提供了丰富的Dialog函数,本文介绍最常用的8种对话框的使用方法,包括普通(包含提示消息和按钮).列表.单选.多选.等待.进度条.编辑.自定义等多种形式,将在第2部分介绍 ...

随机推荐

  1. MySql数据库索引优化注意事项

    设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率.设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为 ...

  2. 堆排序(Heap Sort)的C语言实现

    堆排序(Heap Sort)具体步骤为 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆 将顶部元素与堆尾数组交换,此是末尾元素就是最大值, ...

  3. PHP之路——MySql查询语句

    1,select查询的基本结构 select 字段 from 表 where 过滤条件 group by 分组条件 having 过滤的第二条件 order by 排序条件 limit 限定结果条件; ...

  4. ios学习-delegate、传值、跳转页面

    ios学习-delegate.传值.跳转页面     1.打开xcode,然后选择ios--Application--Empty Application一个空项目. 项目目录: 2.输入项目名称以及选 ...

  5. DC-DC转换器原理与应用

    DC/DC转换器为转变输入电压后,有效输出固定电压的电压转换器.DC/DC转换器分为三类:升压型DC/DC转换器.降压型DC/DC转换器以及升降压型DC/DC转换器.根据需求可采用三类控制.PWM控制 ...

  6. 14.4.5 System Tablespace 系统表空间

    14.4.5 System Tablespace 系统表空间 InnoDB 系统表空间包含InnoDB 数据目录(元数据 用于InnoDB相关对象)和是存储区域用于doublewrite buffer ...

  7. Number of 1 Bits——LeetCode

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...

  8. 酷派D530刷机指引之官方ROM

    刷机前的准备工作 刷官方ROM的大致过程就是:先手机连接电脑,然后在电脑上运行刷机工具,然后那个刷机工具就会把你选择的ROM装到手机里面,然后就没有然后了. 所以在刷机之前,硬件方面需要准备好: 充满 ...

  9. [转载]Android开发必备的21个免费资源和工具

    转载自: http://blog.csdn.net/shimiso/article/details/6788375 Android移动开发平台现在不是一个“火”字能形容的,今年Android平台在市场 ...

  10. MVC中各类文件

    sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文件,创建应用程序所需的引用.数据连接.文件夹和文件的信息. .aspx:Web 窗体页由两部分组 ...