【问题标题】:ScrollView not scrolling with ConstraintLayout and guidelineScrollView 不使用 ConstraintLayout 和指南滚动
【发布时间】:2017-10-06 14:54:11
【问题描述】:

我必须制作一个布局,上面有图片,上面有文字。图像高度必须是根布局高度的 40%。文本具有可变高度。因此,整个东西都必须放在一个 ScrollView 中。

这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorTutorialGrey"
>


<ScrollView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:fillViewport="true"
    >

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <android.support.constraint.Guideline
            android:id="@+id/guideline"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintGuide_percent="0.4"/>

        <ImageView
            android:id="@+id/tutorial_image"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/guideline"
            tools:src="@drawable/splash_bg"
            />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:padding="32dp"
            app:layout_constraintTop_toBottomOf="@id/guideline"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            >

            <TextView
                android:id="@+id/tutorial_title"
                style="@style/Tutorial.Title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                tools:text="Alle Neuerungen der App auf einen Blick"
                />

            <TextView
                android:id="@+id/tutorial_description"
                style="@style/Tutorial.Description"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                tools:text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet. no sea takimata sanctus est Lorem ipsum dolor sit amet."
                />

        </LinearLayout>

    </android.support.constraint.ConstraintLayout>

</ScrollView>
</android.support.constraint.ConstraintLayout>

布局就像是想要的那样,但是一旦我放入指南,ScrollView 就不再滚动了。

我犯了什么错误,如何才能实现所需的布局和行为?

【问题讨论】:

  • 你为什么要使用约束布局......
  • 我看到Guideline 视图超出了第二个ConstraintLayout
  • 我不需要使用 ConstraintLayout,但我需要实现: - ImageView 和 TextViews 必须在 ScrollView 内 - ImageView 必须具有 Root 布局高度的 40% - TextView 具有可变高度,也可以超过根布局高度的 60%

标签: android android-scrollview android-constraintlayout


【解决方案1】:

准则和图像视图必须具有相同的ConstraintLayout 作为父级。将指南移到图像视图上方,您应该已设置好。

附带说明,您可能不需要最外层的ConstraintLayout。您也可以摆脱嵌套的LinearLayout 以获得更扁平的布局。


您设置的准则是基于百分比的。不幸的是,这个百分比似乎只是视图总可滚动高度的一小部分,而不仅仅是您在屏幕上看到的高度。

您希望图像占据滚动视图可见部分的 40%。我建议您将 XML 中的准则设置为固定大小(例如 app:layout_constraintGuide_begin="100dp")并更改代码中的准则位置,执行以下操作:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.scrollable);
    final ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.layout);

    layout.post(new Runnable() {
        @Override
        public void run() {
            final ScrollView scrollView = (ScrollView) layout.findViewById(R.id.scrollView);
            final Guideline guideline = (Guideline) findViewById(R.id.guideline);
            final ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams) guideline.getLayoutParams();
            lp.guideBegin = (int) ((scrollView.getHeight()) * 0.4);
            guideline.setLayoutParams(lp);
        }
    });
}

我建议使用ConstraintSet#setGuidelineBegin,但我无法让它发挥作用。你可能会有更好的运气。

【讨论】:

  • 我更新了上面的代码,但是只要我在其上放置一个带有约束的 Guidline (ImageView),Scrollview 就不会滚动。
  • @sneps 似乎不适用于ConstraintLayout 1.0.2,但适用于我正在使用的 1.1.0-beta2。可以用 1.1.0-beta2 吗?
  • 滚动确实适用于 1.1.0-beta2,但图像的 40% 高度现在是内部约束布局高度的 40%。但我需要视口(或根约束布局或滚动视图)高度的 40%。有什么想法吗?
猜你喜欢
  • 2020-04-29
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多