您的位置:首页 > 运维架构

自定义popwindow

2017-04-28 13:39 141 查看

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

}
};


最总效果:


“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  popwindow