我有一个布局,其中TextView(可变宽度)需要能够在父级的整个范围内水平移动(基于数据和视图事件)。
我为实现这一目标所做的工作是使用带有指导原则的ConstraintLayout。该准则有一个app:layout_constraintGuide_percent
约束,我可以通过编程在0和1之间进行调整,并且TextView被约束为该准则layout_constraintEnd_toEndOf
和layout_constraintStart_toStartOf
。
这里的问题是,当该准则的percent
接近0或1(在我的情况下,分别为0.05和0.95)时,TextView开始消失,超出视图范围。
在iOS中,我会创建一个更高优先级的约束,将TextView限制在父对象的边界,但是使用Android ConstraintLayout似乎不太可能?
完整版式文件:
<androidx.constraintlayout.widget.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:layout_marginEnd="10dp"
android:layout_marginStart="10dp"
android:paddingTop="20dp"
>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="@+id/guideline"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
tools:text="Variable text!"
/>
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintTop_toBottomOf="@id/textview"
/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
答案 0 :(得分:0)
您可以使用2个垂直参考线,并将textView约束到两个垂直参考线,这样,当1条参考线移动时,另一条也要移动,并且textView仍将保持在屏幕范围内。
以下是一个示例(可以将准则移至0.95和0.05):
<androidx.constraintlayout.widget.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:id="@+id/frameLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Fragments.MenusDesign.ExpandableCategoriesMenu.ExpandableCategoriesMenu"
tools:layout_editor_absoluteY="81dp">
<TextView
android:id="@+id/textview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:paddingBottom="5dp"
android:visibility="visible"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
tools:text="Variable text!" />
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="4dp"
app:layout_constraintTop_toBottomOf="@id/textview"
tools:layout_editor_absoluteX="0dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.0" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.18" />
您可以做的另一件事是使用this library来确保文本将根据剩余空间调整大小:
如果要使用此库,请将其添加到gradle:
implementation 'me.grantland:autofittextview:0.2.+'
现在只需创建您的textView:
<me.grantland.widget.AutofitTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:maxLines="2"
android:textSize="40sp"
autofit:minTextSize="16sp"
/>