自定义popwindow

自定义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));

        }
    };

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值