Programming/Android

[Android]스크롤 뷰 안에 웹뷰가 있을 경우 스크롤 뷰만 스크롤 되는 문제(Webview inside ScrollView scrolled only ScrollView)

Fimtrus 2017. 7. 28. 10:19

스크롤뷰 안에 스크롤이 필요한 경우


NestedScrollView를 이용하여, 스크롤이 되게 할 수 있는데,


웹뷰의 경우는 웹페이지가 스크롤이 필요한 경우라 NestedScrollView로 해결 할 수 없다.


해당 문제를 해결하기 위해선, 웹뷰에서 발생하는 터치 이벤트를


다른 뷰에 뺏기지 않아야 원하는 결과를 얻을 수 있다.



먼저 웹뷰를 상속 받는 클래스를 하나 만든다.

상속 받은 웹뷰 클래스에 onTouchEvent 메소드를 Overriding 한다.


public class RoadView extends WebView {

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
    }
}


requestDisallowInterceptTouchEvent(true)를 추가 하면 웹뷰 단에서 처리할 코드는 완료된다.


이 메소드는 웹뷰에서 발생하는 이벤트를 다른 뷰에서 가로채는 것을 막는 역할을 한다.


따라서 부모뷰인 스크롤뷰가 웹뷰에서 발생하는 이벤트를 가로채지 못하게 된다.




마지막으로 아래와 같이 xml에 적용 하면 스크롤이 가능한 웹뷰가 만들어진다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

                <com.fimtrus.test.view.RoadView
                    android:id="@+id/roadview"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:layout_marginBottom="16dp" />
               
        </LinearLayout>
    </ScrollView>
</LinearLayout>