Android中點擊空白區域控件自動隱藏(事件傳遞機制中的一個小例子)

隨着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

相關文章
相關標籤/搜索