在设计支持库(来自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" />
提前谢谢!
答案 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响应WebViewapp: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>
这对我有用。