Dialog与PopWindow

原创 2016年08月25日 11:40:43

Dialog style解析(通俗理解)


  1. 如果dialog的style继承了系统样式,比如parent="@android:style/Theme.Dialog"或者parent="Theme.AppCompat.Light.Dialog",那么写item的时候name后面就不用带android,类似这样 <item name="windowActionBar">false</item>,但是如果不继承的话就需要强制带上android:类似这样<item name="android:windowActionBar">false</item>
  2. 想要dialog全屏需要用代码设置dialog的宽度,试过<item name="android:windowFullscreen">true</item>,但是没什么作用,所以还需要手动设置,Window window = customDialog.getWindow();
    WindowManager.LayoutParams attributes = window.getAttributes();
    attributes.width = getResources().getDisplayMetrics().widthPixels;
    window.setAttributes(attributes);
    其他固定宽度直接在布局文件里设置就行。
  3. 一般需要设置的属性有
    <item name="android:windowActionBar">false</item> 一般为false
    <item name="android:windowNoTitle">true</item> 一般为true
    <item name="android:windowFrame">@null</item> 一般为@null
    <item name="android:windowFullscreen">true</item> 好像没什么作用
    <item name="android:windowIsTranslucent">false</item> 是否半透明,好像没什么作用
    <item name="android:windowIsFloating">true</item> 一般为true,否则就会像activity一样
    <item name="android:background">#00000000</item>
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowCloseOnTouchOutside">true</item> 设置点击外部是否会dismiss
    <item name="android:backgroundDimEnabled">false</item> 设置是否需要透明黑背景,true表示有,false表示没有
  4. 因为上面背景都设置为了透明,所以写布局的时候需要显式的设置背景颜色
  5. dialog默认是居中的,如果想让其居于底部需要在代码里设置dialog.getWindow().setGravity(Gravity.BOTTOM);

PopWindow 嵌套ListView


我写该popWindow工具类主要是项目中如果用到多次的话,将其封装,每次都能直接使用,比较方便,而且格式能够统一

1.首先是布局文件,比较简单,就一个ListView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              android:background="@drawable/pop_back"
    >

    <ListView
        android:id="@+id/pop_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@color/light_gray"
        android:dividerHeight="1px"
        android:listSelector="@color/transparent"
        android:scrollbars="none"
        />
</LinearLayout>

2.其次是ListView里面需要用的Java Bean

public class PopStringItem {
    private String id;
    private int icon;
    private String name;

    public PopStringItem(String id,int icon, String name) {
        this.id = id;
        this.icon = icon;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIcon() {
        return icon;
    }

    public void setIcon(int icon) {
        this.icon = icon;
    }
}

3.然后是popWindow的实现代码

public class ListPopWindow extends PopupWindow implements View.OnKeyListener {
    private List<PopStringItem> itemList;
    private LayoutInflater inflater;
    private PopListItemClickListener listItemClickListener;

    private Window window;
    private final WindowManager.LayoutParams params;

    public ListPopWindow(Context context, List<PopStringItem> items, PopListItemClickListener listItemClickListener) {
        super(context);
        init(context);
        window = ((Activity) context).getWindow();
        params = window.getAttributes();

        this.itemList = items;
        this.listItemClickListener = listItemClickListener;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.list_pop_window, null);
        setContentView(view);
        ListView listView = (ListView) view.findViewById(R.id.pop_list);
        if (items.size() == 1) {
            listView.setDividerHeight(0);
        }
        MyAdapter adapter = new MyAdapter();
        listView.setAdapter(adapter);
        listView.setOnKeyListener(this);
        listView.setOnItemClickListener(adapter);
    }

    private void init(Context context) {
        int w = context.getResources().getDisplayMetrics().widthPixels;
        setWidth(w / 3);  //需要显示设置宽高度
        setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        setFocusable(true);//设置popWindow是否具有获取焦点的能力,默认为false,一般来讲作用不大,但如果里面包含EditText等需要获取焦点的控件必须设置为true
        setOutsideTouchable(true);//设置点击外部区域popWindow是否会消失
       setBackgroundDrawable(new BitmapDrawable());  //设置popWindow的背景,只有加了该属性之后,setOutsideTouchable才会起作用,而且加了它之后,popWindow对手机的返回键才有响应,点击返回按钮,关闭popWindow,否则就会关闭popWindow所在的Activity
       update();
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        dismiss();
        return true;
    }

    @Override
    public void showAsDropDown(View anchor) {
        params.alpha = 0.5f;  //如果popWindow显示的时候想让window背景变透明,就需要这样做
        window.setAttributes(params);
        super.showAsDropDown(anchor);
    }

    @Override
    public void showAsDropDown(View anchor, int xoff, int yoff) {
        params.alpha = 0.5f;
        window.setAttributes(params);
        super.showAsDropDown(anchor, xoff, yoff);
    }

    @Override
    public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) {
        params.alpha = 0.5f;
        window.setAttributes(params);
        super.showAsDropDown(anchor, xoff, yoff, gravity);
    }

    @Override
    public void dismiss() {
        params.alpha = 1f;  //设置回来
        window.setAttributes(params);
        super.dismiss();
    }

    class MyAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {

        @Override
        public int getCount() {
            int ret = 0;
            if (itemList != null) {
                ret = itemList.size();
            }
            return ret;
        }

        @Override
        public PopStringItem getItem(int position) {
            return itemList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            PopStringItem item = getItem(position);
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.item_pop_list, parent, false);
                holder = new ViewHolder();
                holder.image = (ImageView) convertView.findViewById(R.id.image);
                holder.text = (TextView) convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            int icon = item.getIcon();
            if (icon == 0) {
                holder.image.setVisibility(View.GONE);
            } else {
                holder.image.setVisibility(View.VISIBLE);
                holder.image.setImageResource(icon);
            }
            holder.text.setText(item.getName());
            return convertView;
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            PopStringItem item = getItem(position);
            if (listItemClickListener != null) {
                listItemClickListener.onClick(item);
            }
        }

        class ViewHolder {
            ImageView image;
            TextView text;
        }
    }

    //一个回调接口,交给使用PopWindow的Activity来处理
    public interface PopListItemClickListener {
        void onClick(PopStringItem item);
    }
}

4.popWindow的使用

//显示
 if (popupWindow == null) {
                popupWindow = new ListPopWindow(context, items, this);//items要提前赋值,this表示该类实现上面的回调点击事件
            }
   popupWindow.showAsDropDown();//需要设置参数
//点击事件的回调
 @Override
    public void onClick(PopStringItem item) {
        popupWindow.dismiss();
        if (item.getId().equals("")) {
            //根据id判断点击哪个item,进行事件处理
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

android popwindow和dialog的取舍

android之中,对话窗口使用率极高,表现在提示用户或者是弹出操作栏之上。 那么,他们之前的取舍应该在哪呢? 首先对比一下他们之间的共同之处 1.都可以根据setContentView来设置...
  • gan303
  • gan303
  • 2016年02月27日 13:20
  • 2570

笔记41--Dialog和Popupwindow

android的对话框有两种:Dialog和Popupwindow 区别: 1、Dialog
  • mwj_88
  • mwj_88
  • 2014年06月12日 23:08
  • 6122

android中Dialog和PopupWindow的区别

android的系统弹出控件很多,Toast,OptionsMenu,Dialog,PopupWindow等。一大堆的弹出控件,文档又没有明确说出各控件应用于哪些场景,使得实际开发中很多鸡肋,有时候自...
  • eclothy
  • eclothy
  • 2014年09月17日 12:00
  • 5695

Dialog中弹出PopupWindow

Dialog中弹出PopupWindow,PopupWindow不显示的问题。
  • u010906636
  • u010906636
  • 2016年10月14日 16:34
  • 942

Android AlertDialog和PopupWindow使用和区别

在实际的开发中,我们经常会用到弹框,以此来显示一个警告或提醒或者提供一系列选项让用户选择。前段时间在开发时,要用到弹框,突然意识到好像两个都可以完成需求,当时我在想,那它们到底有什么区别呢?于是查了相...
  • android_cmos
  • android_cmos
  • 2016年04月30日 23:32
  • 7869

PopupWindow和AlertDialog的使用和区别

笔记啊
  • zz592962131
  • zz592962131
  • 2016年01月06日 11:08
  • 2022

DIalog与popWindow布局

  Android默认的PopupWindow和EditText的外观是矩形框,看起来不是太好,本示例通过设置布局View的背景和PopupWindowd对象的背景,实现有白色圆角边框的对话框效果和圆...
  • cgaanns
  • cgaanns
  • 2011年03月22日 12:48
  • 350

PopupWindow和dialog的显示位置

PopupWindow 两个方法:showAtLocation(相对于组件parent屏幕)和showAsDropDown(相对于组件) showAtLocation:  public void s...
  • Kac930
  • Kac930
  • 2017年04月24日 18:44
  • 371

Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

【工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重劳动成果】1 背景之所以写这一篇博客的原因是因为之前有写过一篇《Android应用setContentV...
  • yanbober
  • yanbober
  • 2015年06月08日 20:50
  • 35041

工具类--PopDialogUtils 窗口提示工具类

public class PopDialogUtils { private Context mContext; public PopDialogUtils(Context cont...
  • jackron2014
  • jackron2014
  • 2016年08月22日 14:07
  • 1096
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dialog与PopWindow
举报原因:
原因补充:

(最多只允许输入30个字)