自定义popwindow

来源:互联网 发布:亲爱的程序员书包网 编辑:程序博客网 时间:2024/06/01 07:45

自定义popwindow

前言:很普通的popwindow,温故下。
1. PopupWindow是一个以弹窗方式呈现的控件,可以用来显示任意视图(View),而且会浮动在当前活动(activity)的顶部。
2. 基本属性:
设置宽的值,可以是WRAP_CONTENT、MATCH_PARENT、也可以是具体数值
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
设置高的值,可以是WRAP_CONTENT、MATCH_PARENT、也可以是具体数值
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
设置popwindow的布局
popupWindow.setContentView(view);
上面三个属性是必要属性,必须设置,否则不会加重view.
setBackgroundDrawable(new ColorDrawable(0x00000000));
设置popwindow的背景,这个属性目前也是必须的(目前版本)可能会导致返回键不起作用,先看源码
部分源码
在不设置背景为null的情况下,会直接返回contentView。不为null情况下,会根据mContentView和
mBackground生成新的mBackgroundView。在往下看发现PopupBackgroundView是一个内部私有类继承至FrameLayout,且该类完成了对onKey和onTouch事件的分发处理。如下:
返回鍵事件contentView我们并没有进行onKey和onTouch事件的分发处理,所以在backgroundDrawable!=null的情况下,即使PopupWindow获得屏幕焦点,PopupWindow也不能处理物理按键的点击事件.
3. 设置位置属性:
让其显示在目标View的正左下方
showAsDropDown(View target):
相对目标控件的位置,有偏移;xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,正值是向下,负值是向上(正左下方为基准)
showAsDropDown(View anchor, int xoff, int yoff):
相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
showAtLocation(View parent, int gravity, int x, int y):
4. 其他属性
setFocusable(true);//获取焦点
需要注意的是,如果为设置false,点击系统返回键(如果没对返回键处理)则会退出activity。
setOutsideTouchable则表示PopupWindow内容区域外的区域是否响应点击事件,表示点击内容区域外的区域是否关闭窗口,那么设置为true应该就是表示关闭,设置为false就是表示不关闭.
private OnDismissListener dismissListener = new OnDismissListener() {
@Override
public void onDismiss() {
//处理popwindow消失后的事件
}
};
popwindow消失的监听
5. popwindow的动画:
setAnimationStyle(R.style.pop_add_ainm);设置popwindow出现和现实的动画,在styles中设置以下:

 <style name="pop_add_ainm" parent="android:Animation">        <item name="android:windowEnterAnimation">@anim/push_bottom_in</item>        <item name="android:windowExitAnimation">@anim/push_bottom_out</item>    </style>

至于动画效果可自己设置。

demo:

public class SpinerPopWindow<T> extends PopupWindow {    private LayoutInflater inflater;    private ListView mListView;    private List<T> list;    private MyAdapter mAdapter;    public SpinerPopWindow(Context context, List<T> list, OnItemClickListener clickListener) {        super(context);        inflater = LayoutInflater.from(context);        this.list = list;        init(clickListener);    }    private void init(OnItemClickListener clickListener) {        View view = inflater.inflate(R.layout.spiner_window_layout, null);        setContentView(view);        setWidth(LayoutParams.WRAP_CONTENT);        setHeight(LayoutParams.WRAP_CONTENT);        setFocusable(true);        ColorDrawable dw = new ColorDrawable(0x00);        setBackgroundDrawable(dw);        mListView = (ListView) view.findViewById(R.id.listview);        mListView.setAdapter(mAdapter = new MyAdapter());        mListView.setOnItemClickListener(clickListener);    }    private class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return list.size();        }        @Override        public Object getItem(int position) {            return list.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder holder = null;            if (convertView == null) {                holder = new ViewHolder();                convertView = inflater.inflate(R.layout.spiner_item_layout, null);                holder.tvName = (TextView) convertView.findViewById(R.id.tv_name);                convertView.setTag(holder);            } else {                holder = (ViewHolder) convertView.getTag();            }            holder.tvName.setText(getItem(position).toString());            return convertView;        }    }    private class ViewHolder {        private TextView tvName;    }在外部调用:

//构造方法(带list的popwindow,传入了一个list集合,和监听)
mSpinerPopWindow = new SpinerPopWindow(getActivity(), stringList, itemClickListener);
//设置消失监听处理
mSpinerPopWindow.setOnDismissListener(dismissListener);
//显示在目标位置下方
mSpinerPopWindow.showAsDropDown(targetview);

 /**     * popupwindow显示的ListView的item点击事件     */    private AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {            mSpinerPopWindow.dismiss();            tvSpinner.setText(stringList.get(position));        }    };

最总效果:这里写图片描述
“`

1 0
原创粉丝点击