這段時間在工作過程了,學到了一些東西,拿來和大家分享分享。這期博客主要分三塊來寫,第一塊是自定義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上時候的動畫。到時候會給大家來分享喲,記得點贊,(^__^) 嘻嘻……