Dialog与PopWindow

来源:互联网 发布:网站源码可以干吗 编辑:程序博客网 时间:2024/04/30 15:04

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,进行事件处理        }    }
2 0
原创粉丝点击