webview height在nestedScrollView中无限增长

时间:2015-11-13 08:41:18

标签: android webview android-coordinatorlayout android-collapsingtoolbarlayout nestedscrollview

这是我的布局。当我加载google.com时,webview的高度会无限增长。 webview的onSizeChange函数不断被调用,我可以看到webview不断无限扩展。我已经尝试了22.2.1和23.1.0的设计和appcompat库并没有效果。

任何解决方案? : - |

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="fill_vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <com.example.ajay.scrollabletoolbar.MyWebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"/>
</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbarlayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true">

    <android.support.v7.widget.Toolbar
        android:id="@+id/restricted_browser_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        android:background="@color/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFFFF"
            android:descendantFocusability="beforeDescendants"
            android:focusableInTouchMode="true">

            <EditText
                android:id="@+id/current_url"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerVertical="true"
                android:backgroundTint="@android:color/darker_gray"
                android:dropDownAnchor="@+id/restricted_browser_toolbar"
                android:hint="hint hint"
                android:imeOptions="actionGo|flagNoExtractUi"
                android:inputType="textNoSuggestions|textUri"
                android:paddingBottom="8dp"
                android:paddingEnd="8dp"
                android:paddingStart="8dp"
                android:singleLine="true"/>

            <ImageView
                android:id="@+id/clear_url_text"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_alignRight="@+id/current_url"
                android:layout_centerVertical="true"
                android:layout_marginRight="8dp"
                android:src="@android:drawable/ic_menu_close_clear_cancel"
                android:visibility="gone"/>
        </RelativeLayout>
    </android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>

2 个答案:

答案 0 :(得分:6)

在一句话中,你只是无法WebView置于NestedScrollView内。这是按预期工作的。

如果您在WebView(或NestedScrollView)内放置ScrollView,则WebView会根据View.MeasureSpec.UNSPECIFIED要求衡量其尺寸。无论你为MATCH_PARENT的身高设置WebView甚至固定大小如100dp。 NestedScrollView迫使其子女以View.MeasureSpec.UNSPECIFIED要求衡量自己。这一切都发生在NestedScrollView的{​​{3}}方法。它如下所示:

@Override
protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
    ViewGroup.LayoutParams lp = child.getLayoutParams();
    int childWidthMeasureSpec;
    int childHeightMeasureSpec;
    childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft()
            + getPaddingRight(), lp.width);
    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}

并且MeasureSpec.UNSPECIFIED意味着,正如其标签所暗示的那样,它可以是它想要的任何大小。我认为measureChild()中的这张幻灯片可以帮助您理解它。

"Writing Custom Views for Android" session at Google I/O 2013

实际上这是enter image description here中讨论的问题,根据this thread

  

这就像在桌面上一样,您将浏览器窗口的大小调整为页面高度,使其无法垂直滚动。滚动发生在NestedScrollView而不是webview本身。因此,页面中没有js的结果会看到任何滚动事件,因此它不知道您已滚动到页面末尾加载更多内容。

所以,底线是,不要WebView放在NestedScrollView内。您应该让WebView滚动网页本身。快乐的编码! :)

答案 1 :(得分:0)

我很抱歉没有提前解决这个问题。我们不能将webview放在nestedScrollView中。但是NSV的本质,它将它的孩子扩展到它的全高,以便它能够按预期使用工具栏来获得可折叠/可滚动的工具栏等。因此,如果添加了webview,webview将无限增长或大幅增长价值,因此它不会按预期工作。这可以是参考:code.google.com/p/android/issues/detail?id=198965