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,进行事件处理
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

dialog+popwindow

  • 2016年04月14日 15:36
  • 3.72MB
  • 下载

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

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

Popwindow与Dialog不同方式展示底部动画弹起弹窗

本文为 PopWindow和dialog的详解 以及使用 带动画效果 附带源码地址                                1 相同点 :           ...

PopWindow与Dialog效果

  • 2015年08月10日 22:20
  • 2KB
  • 下载

DIalog与popWindow布局

  • 2011年11月17日 17:23
  • 74KB
  • 下载

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

5 Android应用Toast窗口添加显示机制源码 5-1 基础知识准备在开始分析这几个窗口之前需要脑补一点东东,我们从应用层开发来直观脑补,这样下面分析源码时就不蛋疼了。如下是一个我们写的两个应...

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

浅析 Android 窗口的加载机制 以及Dialog PopWindow Toast显示机制
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dialog与PopWindow
举报原因:
原因补充:

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