这段时间在工作过程了,学到了一些东西,拿来和大家分享分享。这期博客主要分三块来写,第一块是自定义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上时候的动画。到时候会给大家来分享哟,记得点赞,(^__^) 嘻嘻……