自定义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));
}
};
最总效果:
“`