您的位置:首页 > 移动开发 > Android开发

Android开发自定义popupwindow

2015-07-13 14:23 537 查看
这段时间在工作过程了,学到了一些东西,拿来和大家分享分享。这期博客主要分三块来写,第一块是自定义popupwindow,第二块是关于adapterView,f在开发中产生的bug,第三块是近期的一些学习内容。本博客内容纯属原创,如要转载请在开头表明出处,谢谢。

自定义popupwindow

public class CustomPopupwindow extends Popupwindow{

private view mMenuView;
private int height;
private int bottonHeight;
private int left;
private int right;

public CustomPopupwindow(Context context,int layoutResId,int bottomViewId){
super(context);
initView(context,layoutResId,buttonViewId,0);
}

public CustomPopupwindow(Context context,int layoutResId,int bottomViewId,int animationStyleId){
super(context);
initView(context,layoutResId,buttonViewId,animationStyleId);
}

public View getmMenuView(){
return mMenuView;
}

private void initView(Context context,int layoutResId,final int bottomViewId,int animationStyleId){
mMenuView = (context.getSystemService(Context.LAYOUT_INFLATER_SERCICE)).inflate(layoutResId,null);
this.setContentView(mMenuView );
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
this.setFocusable(true);
if(animationStyleId != 0){
this.setAnimationStyle(animationStyleId);
}else{
//这里可以设置默认的动画,如果不设置则调用系统的默认来处理,也就没有动画显示
}
//设置popupwindow半透明背景
ColorDrawable colorDrawable = new ColorDrawable(0xa0000000);
this.setBackgroundDrawable(colorDrawable );
mMenuView.setOnTouchListener(new OnTouchListener(){

//判断点击的位置是否在popupwindow里面,不在就把popupwindow dismiss
public boolean onTouch(View view ,MotionEvent event){
left = mMenuView.findViewById(bottomViewId).getLeft();
right = mMenuView.findViewById(bottomViewId).getRight();
height = mMenuView.findViewById(bottomViewId).getTop();
bottonHeight = mMenuView.findViewById(bottomViewId).getBottom();
int x = (int)event.getX();
int y = (int)event.getY();
if(event.getAction() == MotionEvent.ACTION_UP){
if( y < height || y > bottonHeight){
dismiss();
}
if(x < left || x > right){
dismiss();
}
}
return true;
}
}
);
}
}


参数介绍

layoutResId表示将要inflate的整体布局

bottomViewId表示实际有控件,实际参与touch事件的布局,位于上面的布局中

animationStyleId表示对popupwindow出现时候定义的动画,一般用资源文件引用

用的时候,根据构造方法传入相关参数,然后用getmMenuView()获得这个popupwindow,在调用系统关于popupwindow的show()即可。

好了,介绍完毕。有兴趣的同学可以用一用。

2.adapterView

关于adapterView,没有太多讲述的。我们平时的listview gridview都属于adapterView。顾名思义,跟adapter有关。f在项目中,直接给gridview设置了onclicklistener,然后就崩溃了。查看logcat,发现如下。

java.lang.RuntimeException: Don’t call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead

然后f debug跟了一下看到了这个方法。在adapterView的方法中有一个

@Override
public void setOnClickListener(OnClickListener l) {
throw new RuntimeException("Don't call setOnClickListener for an AdapterView. "
+ "You probably want setOnItemClickListener instead");
}


so。。。我想你也看明白了,记得listview,gridview设置onItemClickListener(),或者设置onTouchListener().以前对这个没有概念,现在有了。。。(测试提了好多关于这个的bug - -)

3. 学习计划

最近想学一点自定义view配合动画的使用。例如华为手机屏幕右边小正方形往上拉时候清除内存的动画,我会考虑实现一下,写个demo。还有动态生成view以后,add到layout上时候的动画。到时候会给大家来分享哟,记得点赞,(^__^) 嘻嘻……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 自定义 popup