為了實現上滑懸停的TabView,使用了CoordinatorLayout,每一個Tab里都是一個NestedScrollView。2. 問題布局在如圖所選的區域滑動(RelativeLa..." />
標籤:

解決NestedScrollView中,在子View上滑動不觸發滾動事件,卻觸發點擊事件

-align:center;">

為了實現上滑懸停的TabView,使用了CoordinatorLayout,每一個Tab里都是一個NestedScrollView。

2. 問題布局

在如圖所選的區域滑動(RelativeLayout),只會觸發圖片的點擊事件,不會觸發CoordinatorLayout的滑動事件使Tab上方的布局展開或者收起。而在其它區域(LinearLayout)滑動則會正常滾動

3. 截圖

分析

1. 事件分發機制

遇到滑動衝突的問題,第一反應自然是Android的事件分發機制。

先來複習下:

從源碼ViewGroup來分析一個L控制項的事件傳遞過程,引用自《Android深入透析》之Android事件分發機制。

可是因為子布局(RelativeLayout)中需要完成點擊事件,所以倘若父布局(LinearLayout)攔截了觸摸事件之後,子布局上滑動事件的確能正確相應了,但是點擊操作就無法實現了。

2. 面向Stackoverflow編程

在嘗試了事件攔截,自定義view等一系列嘗試之後,我決定想谷爹求助。

最後我找到了這個:Scroll doesn』t work in NestedScrollView when try to scroll from views with click events。

也就是說,不能滾動的原因是你滾動布局內的布局長度不夠。

讓我們來複現一下:

注意紅箭頭處的間隙,可以看到LinearLayout的長度是沒有撐滿屏幕的。

3. 解決辦法

用setMinimumHeight給NestedScrollView內的子布局設置最小高度,這裡最好通過代碼計算出這個高度的值。

DisplayMetrics displaymetrics = new DisplayMetrics();
getBaseActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHeight = displaymetrics.heightPixels;
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (getBaseActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
view.setMinimumHeight(screenHeight - actionBarHeight);

總結

Google大法好!Stackoverflow大法好!

ps:原文鏈接解決NestedScrollView中,在子View上滑動不觸發滾動事件,卻觸發點擊事件 - Journey的博客 - 博客頻道 - CSDN.NET


推薦閱讀:

TAG:Android開發 |