1. 程式人生 > >Android ScrollView巢狀ScrollView,並且巢狀的ScrollView超過螢幕部分

Android ScrollView巢狀ScrollView,並且巢狀的ScrollView超過螢幕部分

問題:我在ScrollView裡面嵌套了一個ScrollView,巢狀的ScrollView超出了螢幕顯示部分,需要向下滑動才能看到,當滑動下去找到巢狀的ScrollView時,滑動時並不能觸發它的onTouch()事件。

解決思路:
1. 先是參考的http://mengsina.iteye.com/blog/1707464這一篇文章,主要利用了在onTouch()事件裡面寫v.getParent().requestDisallowInterceptTouchEvent(true); 這種方法,讓父ScrollView不攔截Touch事件,自己來處理。

親自實驗了這個方法,當巢狀的ScrollView不超出螢幕時是可以用的,可是當巢狀的ScrollView超出螢幕時,就不可以了。
程式碼如下,當touch子ScrollView時,打印出”觸摸了第2個ScrollView”,然而並沒有成功,結果在後面,全都是列印的”觸摸了第1個ScrollView”:
MainActivity.java->onCreate():

//父ScrollView
svParent = (ScrollView) findViewById(R.id.sv_parent);
        svParent.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                ViewParent parent = findViewById(R.id.sv_child).getParent();
                parent.requestDisallowInterceptTouchEvent(false
); //允許父類截斷 System.out.println("觸摸了第1個ScrollView"); return false; } }); //子ScrollView svChild = (ScrollView) findViewById(R.id.sv_child); svChild.setOnTouchListener(new View.OnTouchListener() { @Override public
boolean onTouch(View v, MotionEvent event) { ViewParent parent1 = v.getParent(); parent1.requestDisallowInterceptTouchEvent(true); //不允許父類截斷 System.out.println("觸摸了第2個ScrollView"); return false; } });

結果截圖:
結果

從這個結果來看,Touch事件,沒有傳遞到巢狀的ScrollView上來,應該是被上層的ViewGroup截獲,或者是傳下去被下面的View消費掉了,沒再傳上來。

2.接下來,就是想讓這個巢狀的ScrollView截獲傳遞過來的Touch事件,不再分發下去了。所以想到重寫ScrollView的onInterceptTouchEvent(),讓它返回true,讓這個巢狀的ScrollView截獲這個Touch事件(注意:onInterceptTouchEvent()返回true,表示截獲這個Touch事件;返回false,表示不搭理這個Touch事件)。

自定義ScrollView CustomScrollView.java:

package com.tudou.scrollviewnested;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

/**
 * Created by Administrator on 2016-08-14.
 */
public class CustomScrollView extends ScrollView {
    public CustomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        System.out.println("第2個ScrollView:dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        System.out.println( "第2個ScrollView: onInterceptTouchEvent: ");
//        return super.onInterceptTouchEvent(ev);
     boolean flag = false;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                flag = super.onInterceptTouchEvent(ev);
                break;
            case MotionEvent.ACTION_MOVE:
                flag = true;
                break;
        }

        return flag;

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        System.out.println( "第2個ScrollView: onTouchEvent: ");
        return super.onTouchEvent(ev);
    }
}

在上面的程式碼裡面可以看到,onInterceptTouchEvent()函式,我讓它直接返回了true。再看一下結果,看看呼叫順序哈。
結果截圖:
2

從結果上可以看出這幾個函式的呼叫順序:
1. 是CustomScrollView裡面的dispatchTouchEvent()
2. 是CustomScrollView裡面的onInterceptTouchEvent()
3. 是MainActivity裡面的svChild.setOnTouchListener->onTouch()事件
4. 是CustomScrollView裡面的onTouchEvent()

^_^ OK~~~~~~~

相關推薦

echarts中國地圖上顯示柱並且圖可點選

先放效果圖~~點選之後~~(資料和標題可動態變化)話不多說,直接上程式碼<link rel="shortcut icon" href="${ctx}/static/img/favicon.ico"> <link rel="stylesheet" href="

Android ScrollViewScrollView並且ScrollView超過螢幕部分

問題:我在ScrollView裡面嵌套了一個ScrollView,巢狀的ScrollView超出了螢幕顯示部分,需要向下滑動才能看到,當滑動下去找到巢狀的ScrollView時,滑動時並不能觸發它的onTouch()事件。 解決思路: 1. 先是參考的h

python關於字典字典列表字典根據值進行排序

python 對於字典巢狀字典, 列表巢狀字典排序 例:列表巢狀自字典:d = [{"name": '張三', 's': 68}, {'name': '李四', 's': 97}] 對於列表巢狀字典可以使用python的sorted()方法,也可以使用list的sort()方法: sorted方法可接受

android ScrollViewGridViewListView只顯示一行的解決辦法

注:本文是由網上大神分享的解決方案彙集而成 方法一: 重寫ListView、GridView: 重寫ListView: public class MyListView extends ListView { public MyListView(Context contex

android中關於使用scrollviewLinearLayout頁面滾動條不到底的解決方法

在android中編寫佈局一般會用到scrollview巢狀LinearLayout,使頁面可以自適應其高度。但是有的機型頁面可以顯示全;有的機型頁面顯示不全,滾動條怎麼也滾動不到底部,如下圖所示: 原xml程式碼: <ScrollView         andr

Android 事件分發實踐(一)解決ScrollViewListView滑動的問題

需要在ScrollView裡面巢狀一個ListView,讓ScrollView和它裡面的ListView都能滑動(ListView寬度沒有佔滿ScrollView),先貼上佈局程式碼: <com.example.xujiang.viewlearn.tou

ScrollViewEditText導致EditText顯示多行時滑動失效的問題

ScrollView巢狀EditText,這會有什麼問題呢,我這裡說的是當EditText內輸入多行內容,當EditText所在佈局不夠的時候,必然需要滑動檢視輸入的所有內容。可是當我們把EditText放在ScrollView裡面的時候,會發現EditText的滑動失效了。 原因就

iOS scrollViewtableView可同時滑動

效果圖:   這個頁面可以分成三個部分:最上面為view,可以放廣告等效果,中間是segment選項,下面的部分可滑動顯示,應使用scrollView,根據選項個數迴圈建立tableView。 建立scrollView,根據segment的個數建立tableView

ScrollViewListView顯示不全和位置不是頂部的解決辦法

(1)首先寫一個listview的頁面,用ScrollView進行巢狀,注意ScrollView裡面只能有一個佈局屬性,多個可以用Linearout進行包含 <?xml version="1.0" encoding="utf-8"?> <RelativeL

ScrollViewListViewlistItem.measure(0,0);報空指標異常NullPointerException

1: SrollView巢狀ListView時顯示不全問題及ListView高度問題: 直接上程式碼,使用以下函式解決此問題: public void setListViewHeightOnChildren(ListView listView) {

Android 混排效果之 ScrollView RecyclerView gridview 實現listview gridview 效果

RecyclerView 出現以後 很受大家歡迎 漂亮流暢的列表 簡單的操作 可以幫我們完成很多的列表 但是有一種listview 巢狀gridview 的效果 目前還是需要巢狀才能完成 現在就簡單說一下我的思路 本人的需求是例如手機淘寶頁 本人使用老套的實現模

ScrollView內部Recyclerview防止recyclerview自動獲得焦點

在寫一個ScrollView 巢狀Viewpager和RecyclerView的佈局時,RecyclerView老是自動獲得焦點然後在ScrollView 內部上下自動滾動,嘗試了在Scroll

ScrollViewListview你會遇到的問題(1)!

做開發的時候,把兩個都能滑動的控制元件(同方向滑動),總會遇到滑動事件衝突的狀況,有時候會滑動失效,有時候會顯示不正常。這裡講講ScrollView巢狀Listview可能會出現的問題。 問題描述: <ScrollView android:layout_

ScrollViewRecyclerViewRecyclerView總是把它上面的控制元件頂出頁面(頁面出現自己滾動)

ScrollView巢狀RecyclerView,當我離開當前頁面,然後又回來時,RecyclerView就會把它上邊的控制元件都擠出頁面,它顯示在頁面最上邊。 原因應該是RecyclerView搶了焦點,只需要把ScrollView中最上邊的那個控制元件加上幾句程式碼

GridView在ViewPager中ViewPagerScrollView中不顯示

1.問題描述 ViewPager中的page是GridView,ViewPager巢狀在ScrollView中,ViewPager設定高度為MATCH_PARENT或者WRAP_CONTENT都不顯示。 2.解決方法 2.1 方法1 網上提出的解

解決ScrollviewRecyclerviewGridview等出現內容顯示不全等為

在自定義View和ViewGroup的時候,我們經常會遇到int型的MeasureSpec來表示一個元件的大小,這個變數裡面不僅有元件的尺寸大小,還有大小的模式。 這個大小的模式,有點難以理解。在系統中元件的大小模式有三種: 1.精確模式(MeasureSpec.EXAC

ScrollViewListView載入大量資料介面卡頓問題的探討

之前使用ScrollView巢狀ListView,解決ScrollView巢狀ListView,列表項高度不同,顯示不全的問題,現在發現一個問題,因為在ListView中計算各個列表項的高度,所以ListView實際上是全部展開的,這樣的話,不能使用ListView重用的機

ScrollView+Fragment+ListViewListView麻麻再也不用擔心我不會寫

前言 之前寫了一篇文章 android ListView/GridView與ScrollView巢狀的滑動衝突解決 介紹瞭如何解決ScrollView與AdapterView的巢狀,但是沒有給出demo,那是因為那些程式碼比較多,而且是在手頭的專案裡,業

Android開發中FragmentFragments遇到的問題

Fragment,簡稱碎片,是Android 3.0(API11)提出的,為了相容低版本,support-v4庫中也開發了一套Fragment API,最低相容Android 1.6。 Fragment是依賴於Activity的,不能獨立存在的。 一個Acti

Android 多層fragment viewPager不顯示的問題

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/zkll200/article/details/73692518 先看一段錯誤程式碼,這段程式碼寫在一個 Fragment 中: private void initVi