我必须进行布局,并在顶部放置图像并在上面放置文本。图像高度必须是根布局高度的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就不再滚动了。
我犯了什么错误?如何实现所需的布局和行为?
最佳答案
准则和图像视图必须与父代具有相同的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
,但是我无法使用它。您可能会有更好的运气。