使AppBarLayout响应WebView中的滚动

时间:2015-06-30 14:16:18

标签: android xml webview

在设计支持库(来自I / O)中,Google推出了AppBarLayout。当用户在片段中的WebView中滚动网站时,我正在尝试使工具栏动画出屏幕。当我将我的WebView元素放在NestedScrollView中时它确实有效,但这会使滚动浏览WebView错误并使得缩放变得不可能。 如何让AppBarLayout响应(向下滚动时动画,在向上滚动时返回,就像在NestedScrollView中一样)到WebView?这些是我的XML文件: 主要布局:

<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:fitsSystemWindows="true"
android:id="@+id/main_coordinatorlayout">
<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:id="@+id/appBarLayout">
    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:id="@+id/toolbar"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/Theme.AppCompat.Light"
        app:layout_scrollFlags="scroll|enterAlways"/>
    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tabLayout"/>
</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/viewPager"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_anchor="@id/viewPager"
    app:layout_anchorGravity="bottom|right|end"
    app:borderWidth="0dp"
    android:layout_margin="16dp"
    android:src="@drawable/ic_action_autorenew" />

包含webview的片段代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<WebView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/webView"
    android:layout_gravity="center_horizontal"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

提前谢谢!

3 个答案:

答案 0 :(得分:13)

感谢@ torque203提供此答案。我正在重新发布这个以吸引更多关注它。

您可以扩展webview并实现NestedScrollingChild。例如,您可以使用NestedWebView中的this Github project对象。

从那以后,您可以像支持嵌套滚动一样的普通视图,就像RecyclerView一样:

<your.package.name.NestedWebView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

在我的用例中,这很好用。

再次,@ torque203用于查找此Github项目。

答案 1 :(得分:1)

CoordinatorLayout中的内容必须设计和实现才能使用它,否则它将不会与任何其他同级视图协调。但是......工具栏不是为此而设计的。 AppBarLayout只是一个准备让Toolbar与CoordinatorLayout完美配合的组件。

LinearLayout不适用于CoordinatorLayout.It更简单,你只需要向LinearLayout添加一个属性来告诉它的滚动行为

<LinearLayout
...
app:layout_behavior="@string/appbar_scrolling_view_behavior"
...
>

您可以尝试通过此

使AppBarLayout响应WebView
app:layout_behavior="@string/appbar_scrolling_view_behavior"

因为ScrollView现在是CoordinatorLayout的直接子项。

<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    ...
</LinearLayout>

ScrollView不适用于CoordinatorLayout(再次)。您需要使用Android支持库v4中提供的另一个NestedScrollView,它设计为自出生以来与CoordinatorLayout一起使用。

出于同样的原因,请注意经典的ListView也不能与CoordinatorLayout一起使用。只有RecyclerView可以使用。

答案 2 :(得分:1)

@Rick de Vries 没有任何第三方库的最简单方法是 在 AppBarLayout 制作一个 NestedScrollView 之后,它的子元素仅作为 WebView。以下是相同的示例 -

        </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

这对我有用。