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上時候的動畫。到時候會給大家來分享喲,記得點贊,(^__^) 嘻嘻……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章