web-dev-qa-db-ja.com

NestedScrollViewをスクロールするだけのwebViewを備えたNestedScrollView

以下は、アプリのactionBar/toolbar/tabBarと、ViewPager(webView)を含むnestedScrollViewの正しい動作を処理するためのコードです。 ViewPagerは基本的に通常のwebViewです。

ViewPagerを垂直方向にスクロールできないことを除いて、すべて正常に機能します。 NestedScrollViewのみがスクロールされています。 Facebookアプリと同じ動作が必要です。ニュースフィード(webView)をスクロールすると、tabBarによってツールバーが垂直方向に見えなくなります。

<Android.support.design.widget.CoordinatorLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".ui.activity.FragmentContainer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    >

    <Android.support.design.widget.AppBarLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        >
                <Android.support.v7.widget.Toolbar
                    Android:id="@+id/toolbar"
                    app:theme="@style/M.Toolbar"
                    app:popupTheme="@style/M.Toolbar.PopupTheme"
                    Android:layout_width="match_parent"
                    Android:layout_height="?attr/actionBarSize"
                    app:layout_scrollFlags="scroll|enterAlways"
                    >
                </Android.support.v7.widget.Toolbar>

        <Android.support.design.widget.TabLayout
            Android:id="@+id/tabs"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            app:tabMode="scrollable"
            Android:visibility="gone"
            Android:background="@color/background"
            app:background="@color/background"
            />

    </Android.support.design.widget.AppBarLayout>

    <Android.support.v4.widget.NestedScrollView
        Android:layout_height="match_parent"
        Android:layout_width="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        Android:background="@Android:color/transparent"
        Android:fillViewport="true"
        >

    <com.m.ui.util.EdgeScrollViewPager
        Android:id="@+id/viewpager"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="@Android:color/transparent"
        Android:visibility="visible"
        >

    </com.m.ui.util.EdgeScrollViewPager>

    </Android.support.v4.widget.NestedScrollView>

</Android.support.design.widget.CoordinatorLayout>

そこで、viewPager(webView)をスクロールできるようにするために、webViewを拡張する新しいクラスを追加しました。

パブリッククラスTouchyWebViewはWebViewを拡張します{

    public TouchyWebView(Context context) {
        super(context);
    }

    public TouchyWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TouchyWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

これにより、スクロール可能になるviewPager(webView)の問題が解決されます。ただし、NestedScrollViewは静的になり、tabBar /ツールバーを垂直方向にスクロールすることを拒否します。そのため、webView OR tabBar-toolbarをスクロールすることに固執しています。viewPager(webView)とNestedScrollView(tabBar /ツールバー)の両方を同時にスクロール可能にするにはどうすればよいですか?

私のwebView

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/white">

    <com.m.ui.base.TouchyWebView
        Android:id="@+id/web_webview"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="@Android:color/transparent"
        Android:visibility="visible" />

    <LinearLayout
        Android:id="@+id/web_loadingview"
        Android:orientation="vertical"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:visibility="gone"
        Android:layout_gravity="center">

        <ProgressBar
            style="?android:attr/progressBarStyleLarge"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:indeterminate="true"
            Android:visibility="visible"
            Android:layout_gravity="center"/>
    </LinearLayout>

</FrameLayout>

よろしく

9

このコードを試してください:

class NestedScrollWebView constructor(
        context: Context,
        attrs: AttributeSet): WebView(context, attrs), NestedScrollingChild2 {

    private var lastMotionY = 0
    private var nestedYOffset = 0
    private val scrollOffset = IntArray(2)
    private val scrollConsumed = IntArray(2)
    private val childHelper = NestedScrollingChildHelper(this)

    init {
        isNestedScrollingEnabled = true
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        if (event == null) return false

        val motionEvent = MotionEvent.obtain(event)
        val currentY = event.y.toInt()

        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                nestedYOffset = 0
                lastMotionY = currentY
                startNestedScroll(View.SCROLL_AXIS_VERTICAL)
            }

            MotionEvent.ACTION_MOVE -> {
                var deltaY = lastMotionY - currentY

                if (dispatchNestedPreScroll(0, deltaY, scrollConsumed, scrollOffset)) {
                    deltaY -= scrollConsumed[1]
                    motionEvent.offsetLocation(0f, scrollOffset[1].toFloat())
                    nestedYOffset += scrollOffset[1]
                }

                lastMotionY = currentY - scrollOffset[1]

                val oldY = scrollY
                val newScrollY = Math.max(0, oldY + deltaY)
                val dyConsumed = newScrollY - oldY
                val dyUnconsumed = deltaY - dyConsumed

                if (dispatchNestedScroll(0, dyConsumed, 0, dyUnconsumed, scrollOffset)) {
                    lastMotionY -= scrollOffset[1]
                    motionEvent.offsetLocation(0f, scrollOffset[1].toFloat())
                    nestedYOffset += scrollOffset[1]
                }

                motionEvent.recycle()
            }

            MotionEvent.ACTION_POINTER_DOWN,
            MotionEvent.ACTION_UP,
            MotionEvent.ACTION_CANCEL -> stopNestedScroll()

            else -> { }
        }

        return super.onTouchEvent(event)
    }

    override fun startNestedScroll(axes: Int, type: Int) = childHelper.startNestedScroll(axes, type)

    override fun stopNestedScroll(type: Int) = childHelper.stopNestedScroll(type)

    override fun hasNestedScrollingParent(type: Int) = childHelper.hasNestedScrollingParent(type)

    override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?, type: Int) =
            childHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, type)

    override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?, type: Int) =
            childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow, type)

}

レイアウトでは、WebViewのみを残します。

<com.widget.NestedScrollWebView
    Android:id="@+id/webview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
4
Pavel Dolbik

それは私のために働きます、XMLファイルのNestedScrollviewにこの行を追加してください。

 Android:fillViewport="true"

次に、Webビューの高さwrap_contentを設定します。

<WebView
    Android:id="@+id/webview"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"/>
3
Opriday

同様の問題があり、setFillViewport (true)コードの一部で解決しました

 NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

そしてフラグメントの中に私が座っていたlistViewがありましたAndroid:nestedScrollingEnabled="true" ..スクロールの問題を修正しました

0
Rainmaker