隨着android技術日趨成熟,android應用程序已經由剛開始的單純效果展現變得愈來愈藝術話了,各類動畫,各類佈局層疊,那麼由此就產生了一些問題,好比:一個listview的view的item點擊時沒有反應,界面上罩了層好看的蒙版後,下面的佈局中的控件點擊時無反應等。java
今天我在修改bug的時候就遇到了這樣的問題。 1、item點擊時沒有反應 緣由:你的item中有button或者checkbox等控件,默認狀況下焦點focus是最早交給這些子控件,而ListView的Item能被選中的基礎是它能獲取Focus焦點。 解決辦法: 一、將item layout的根控件設置屬性(android:descendantFocusability=」blocksDescendant」),如下是item的佈局 <!-- lang: java --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F4F2EE" android:descendantFocusability="blocksDescendants" android:orientation="vertical" android:paddingBottom="2dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="7dp" >android
<!-- lang: java --> <Button/> <ImageView/> ........
</LinearLayout > 這樣Item Layout就屏蔽了全部子控件獲取Focus焦點的權限,不須要針對Item Layout中的每個控件從新設置focusable屬性. 2.將ListView的Item Layout中的全部子控件focusable屬性設置爲falseide
2、界面上罩了層好看的蒙版後,下層的佈局中的控件點擊時無反應 緣由:上面罩得那一層蒙版將點擊或者觸摸事件給攔截掉了,Touchevent 中,返回值是 true ,則說明消耗掉了這個事件,返回值是 false ,則沒有消耗掉,會繼續傳遞下去。 在 View 中跟 Touch 相關的事件有 dispatchTouchEvent , interceptTouchEvnet , onTouchEvent 三種。 dispatchTouchEvent 是負責分發事件的,事件從 activity 傳遞出來以後,最早到達的就是最頂層 view 的 dispatchTouchEvent ,而後它進行分發,若是返回 false ,則交給這個 view 的 interceptTouchEvent 方法來決定是否要攔截這個事件,若是 interceptTouchEvent 返回 true ,也就是攔截掉了,則交給它的 onTouchEvent 來處理,若是 interceptTouchEvent 返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchTouchEvent 再來開始這個事件的分發。佈局
若是事件傳遞到某一層的子 view 的 onTouchEvent 上了,這個方法返回了 false ,那麼這個事件會從這個 view 往上傳遞,都是 onTouchEvent 來接收動畫
解決辦法:spa
<!-- lang: java --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F4F2EE" android:orientation="vertical" > <include android:id="@+id/title_view" layout="@layout/title" /> <RelativeLayout> </RelativeLayout> ....... <FrameLayout android:id="@+id/above_fl" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/title_view" android:background="#00000000" > </FrameLayout>
</RelativeLayout> 以上FrameLayout就是上面罩得一層透明的罩子,若是不採起任何措施只是將這個罩到佈局上面的時候,點擊下面的那些控件的時候是無任何響應的,由於這個FrameLayout已經點擊或者觸摸事件給攔截掉了, 這時候可使用如下的代碼讓點擊事件穿透這個罩子,見代碼code
<!-- lang: java --> private FrameLayout outLineView; outLineView = (FrameLayout) findViewById(R.id.above_fl); outLineView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mPopupWindow.isShowing()) { AnimationUtils.rotateDown(title_icon); mPopupWindow.dismiss(); } return false; } });
outLineView的onTouch方法返回false,這樣點擊或者觸摸事件就穿到下面的一層啦。xml