线性布局重叠支持协调布局

9

这是我第一次使用CoordinatorLayout,我不太理解它的工作原理。

我的LinearLayout与我的Toolbar重叠在一起,就像在FrameLayout或RelativeLayout中一样,我不知道如何告诉它去下面(就像RelativeLayout中的android:layout_below一样)

这是我的代码:

<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="192dp"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:src="@drawable/logo2"
                app:layout_collapseMode="pin" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/appbar"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin">

            .... Very Large Form ...
    </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

另一个疑问:我看到的几乎所有示例都是用CoordinateLayout来管理RecyclerView。我的布局不是RecyclerView,而是一个非常长的表单。这样做有意义吗?

</android.support.design.widget.CoordinatorLayout> 的闭合标签是损坏的,因为没有开头标签。 - pskink
抱歉,我粘贴了错误的代码!已修复。 - Juliatzin
5个回答

10

尝试将您的内容嵌套在NestedScrollView中。不要忘记包含layout_behavior XML标签。

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

     <!-- Your scrolling content -->

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

额外资源: http://developer.android.com/reference/android/support/design/widget/AppBarLayout.html


因为如果你忘记使用万能的layout_behavior,你将很难弄清楚为什么无论如何你的操作栏都会在滚动视图下面。我很高兴我找到了这个解决方案,更高兴的是现在Error inflating class android.support.v7.widget.AppCompatSpinner已经过去了(不要把半透明颜色传递给它的背景)。现在我应该回去弄清楚为什么大多数我的文本视图会选择主题/特定的textColor属性,而其中两个不会。唉...我真的很怀念没有材料和支持疯狂的好Android时代。 - kellogs

2
我找到了一个解决方案。我想它可能不是最好的解决方案,但它使一切看起来都很好,并且允许我们继续使用CoordinatorLayout的动画。
我只是将Fragment的margintTop和marginBot设置为与顶部工具栏和底部导航栏完全相同的DP值。
在我的情况下,我的工具栏和导航栏高度为"?attr/actionBarSize"。因此,我只需将片段的顶部和底部边距设置为"?attr/actionBarSize"即可。
再次强调,这并不像使用线性或相对布局那样好,但我担心如果我们选择了那个解决方案,就会浪费CoordinatorLayout的动画。
关于工具栏和底部导航栏:
android:layout_height="?attr/actionBarSize"

在我的Fragment中:

android:layout_marginTop="?attr/actionBarSize"
android:layout_marginBottom="?attr/actionBarSize"

唯一的不好之处是,如果隐藏了应用栏,那么它“曾经”占据的空间将不会被填充。请查看insetEdge和dodgeInsetEdge。 - Clocker

0
晚回答,但可能仍有帮助。
CoordinatorLayout的所有子项包含在一个LinearLayout中,方向为垂直方向
这对我有用。

0

使您的应用栏具有顶部的 insetEdge,并使您的内容布局具有全部或顶部的 dodgeInset。这将使您的线性布局不重叠于应用栏。


-2

来自developer.android.com

"CoordinatorLayout是一个超级强大的FrameLayout。 CoordinatorLayout主要用于两种情况: 作为顶层应用程序装饰或chrome布局 作为一个特定交互的容器,包含一个或多个子视图 通过为CoordinatorLayout的子视图指定Behaviors,您可以在单个父级中提供许多不同的交互,并且这些视图也可以相互交互。当View类用作CoordinatorLayout的子项时,可以使用DefaultBehavior注释指定默认行为。 Behaviors可用于实现各种交互和附加布局修改,从滑动抽屉和面板到可滑动删除的元素和按钮,这些按钮会随着它们移动和动画而粘附到其他元素上。 CoordinatorLayout的子项可能具有锚点。此视图ID必须对应于CoordinatorLayout的任意后代,但不能是锚定的子项本身或锚定的子项的后代。这可用于将浮动视图相对于其他任意内容窗格放置。"

因此,您可以将根视图更改为LinearLayout(垂直方向)或使用ScrollView,这将使子项线性排列。


3
这不是一个真正的答案,你可以引用它,但并没有真正帮助他和社区。请注意,我已经将英文内容翻译成中文,并尽可能保持原意和易懂性。 - Leonardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接