Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android CoordinatorLayout+;AppbarLayout+;Viewpager始终滚动_Android_Layout_Android Viewpager_Coordinator Layout - Fatal编程技术网

Android CoordinatorLayout+;AppbarLayout+;Viewpager始终滚动

Android CoordinatorLayout+;AppbarLayout+;Viewpager始终滚动,android,layout,android-viewpager,coordinator-layout,Android,Layout,Android Viewpager,Coordinator Layout,我有一个经典的布局,上面有一个工具栏,下面有一个TabLayout,还有一个ViewPager从TabLayout切换选项卡。当ViewPager中的内容可滚动时,工具栏应滚动到看不见的地方,而TabLayout应在到达顶部时跟随并粘住 在我当前的代码中,所有这些都很好,除了工具栏始终是可滚动的,而不管ViewPager内容的大小。请参阅下面的代码。关于如何解决这个问题有什么好主意吗 <?xml version="1.0" encoding="utf-8"?> <android

我有一个经典的布局,上面有一个工具栏,下面有一个TabLayout,还有一个ViewPager从TabLayout切换选项卡。当ViewPager中的内容可滚动时,工具栏应滚动到看不见的地方,而TabLayout应在到达顶部时跟随并粘住

在我当前的代码中,所有这些都很好,除了工具栏始终是可滚动的,而不管ViewPager内容的大小。请参阅下面的代码。关于如何解决这个问题有什么好主意吗

<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.ToolBar"
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:scrollbars="horizontal"
            app:tabIndicatorColor="@color/black_text" />

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

    <android.support.v4.view.ViewPager
        android:id="@+id/tabs_activity_view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

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

编辑:


我可以看到viewPager的高度与整个根视图的高度相同。这可能是有意的,因为appbar_滚动_视图_行为似乎添加了顶部和底部偏移。不过,这看起来确实很奇怪,因为它会导致工具栏和选项卡栏始终滚动

尝试在TabLayout上添加这些属性:

 app:layout_collapseMode="pin"
 app:tabMode="fixed"
在AppBarLayout上显示以下内容:

 android:fitsSystemWindows="true"
*更新*

我试过了,但这还不够,因为工具栏仍然可以滚动。 解决方案是对ViewPager(及其内容)进行一些逻辑分析

从xml布局文件中删除工具栏滚动标记属性。 您必须实现一些java代码来检查ViewPager内容高度是否大于screenHeight-(工具栏+选项卡栏)。如果为true,则以编程方式将scroll_标志设置为:

 LayoutParams params;
 params = // get layout params from your toolbar

 params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
| AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);

 // set params
 toolbar.setLayoutParams(params);
我建议你试试这个样品

这是一个与示例中的布局类似的布局

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

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

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

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        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"
        android:layout_gravity="end|bottom"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_done" />

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


根据其他示例、我自己的代码和appbar滚动查看行为的源代码(有点凌乱),查看页面的高度应该是
匹配父对象
而不是
包装内容

        public boolean onDependentViewChanged(CoordinatorLayout parent, View child,
            View dependency) {
        final CoordinatorLayout.Behavior behavior =
                ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior();
        if (behavior instanceof Behavior) {
            // Offset the child so that it is below the app-bar (with any overlap)

            final int appBarOffset = ((Behavior) behavior)
                    .getTopBottomOffsetForScrollingSibling();
            final int expandedMax = dependency.getHeight() - mOverlayTop;
            final int collapsedMin = parent.getHeight() - child.getHeight();

            if (mOverlayTop != 0 && dependency instanceof AppBarLayout) {
                // If we have an overlap top, and the dependency is an AppBarLayout, we control
                // the offset ourselves based on the appbar's scroll progress. This is so that
                // the scroll happens sequentially rather than linearly
                final int scrollRange = ((AppBarLayout) dependency).getTotalScrollRange();
                setTopAndBottomOffset(AnimationUtils.lerp(expandedMax, collapsedMin,
                        Math.abs(appBarOffset) / (float) scrollRange));
            } else {
                setTopAndBottomOffset(dependency.getHeight() - mOverlayTop + appBarOffset);
            }
        }
        return false;
    }
我以一种解释问题的方式来阅读这篇文章,因为这是这段代码的预期行为


我认为我们需要编写自己的滚动行为,特别是对于RecyclerView,

我刚刚遇到了同样的问题。 解决方案非常简单,只需设置您的viewpager高度

android:layout_height="wrap_content"
简单的解决办法是 -使用相对布局包装appbar布局和页面查看器。 -为appbar布局提供一些id -在页面视图中,在下面设置android:layout=“Your\u appbar\u layout” 如:



是否使用ListView作为ViewPager的数据?如果是这样,您需要
listView.setNestedScrollingEnabled(true);

我已经解决了这个问题,尝试了示例Google模板,并发现

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

行必须添加到视图寻呼机属性xml中。它解决了我的问题。

你能更好地解释一下:“工具栏应该滚动到看不见的地方”和“工具栏总是可以滚动的”我不明白搜索结果是什么viewpager中的内容可以滚动和滚动时的结果:选项卡贴在顶部,工具栏可以滚动。当ViewPager中的内容不可滚动时的结果:工具栏在顶部,表格在下面。当ViewPager中的内容不可滚动时,删除app:layout\u behavior=“@string/appbar\u scrolling\u view\u behavior”是否找到解决此问题的好方法?我也有。再次谢谢你,但还是不走运。我必须补充的是,每个ViewPager片段中的内容当然是可变的。有些有可滚动的内容,有些没有。好吧,现在我明白了,试试我的更新答案,也许ViewPager应该有android:layout\u height=“match\u parent”?呵呵。尝试了更新的答案,还匹配了ViewPager上的家长。恐怕还是不走运。也许这是不可行的。ViewPager内容片段包含ScrollView、ListView或RecyclerView?我还想知道:)这几乎是我已经拥有的内容,它也有相同的问题..?此示例是针对您的问题的教程。您可以使用示例模式实现布局。请参见下面的答案。示例项目也有同样的问题。该示例来自谷歌,因此我假设这种行为正是谷歌对坐标布局的期望。换句话说,协调遵循材料设计。如果你想拥有经典的滚动方式,那么你应该考虑RelialayOUT。谢谢,但是它不会改变任何东西。肯尼斯,你可以发布代码“AppBARY-ScLogLink VIEWSY行为”吗?
app:layout_behavior="@string/appbar_scrolling_view_behavior"