Android开发自定义popupwindow

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

  1. 自定义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上时候的动画。到时候会给大家来分享哟,记得点赞,(^__^) 嘻嘻……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值