【问题标题】:How to left align to a centered text in Android如何左对齐到Android中的居中文本
【发布时间】:2021-09-27 19:33:29
【问题描述】:

下面的代码正在产生这个。

我想要这个布局:

顶部的大 textView 占用了父级的全部内容,并且 textsize 使用 android:autoSizeTextType="uniform" 自动调整。 我想将下面的 textViews 与实际文本对齐,而不是与 textView 的框架对齐。

<?xml version="1.0" encoding="utf-8"?>
<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:background="@color/black"
tools:context=".DisplayActivity">

<TextView
    android:id="@+id/timeTextView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:autoSizeMaxTextSize="5000dp"
    android:autoSizeTextType="uniform"
    android:gravity="center_horizontal"
    android:text="2:01:04"
    android:textColor="@color/textColor"
    app:layout_constraintBottom_toTopOf="@+id/guideline2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/timeTextView2"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_marginStart="148dp"
    android:text="2:01:05"

    android:textColor="@color/textColor"
    android:textSize="50dp"
    app:layout_constraintBottom_toTopOf="@+id/guideline4"
    app:layout_constraintStart_toStartOf="@id/timeTextView"
    app:layout_constraintTop_toTopOf="@+id/guideline2"
    app:layout_constraintVertical_bias="0.0" />

<TextView
    android:id="@+id/timeTextView3"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_marginEnd="152dp"
    android:text="2:01:07"
    android:textColor="@color/textColor"
    android:textSize="50dp"
    app:layout_constraintBottom_toTopOf="@+id/guideline4"
    app:layout_constraintEnd_toEndOf="@+id/timeTextView"
    app:layout_constraintTop_toTopOf="@+id/guideline2"
    app:layout_constraintVertical_bias="0.0" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.59" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.75" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

 </androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

    标签: android android-layout android-constraintlayout android-textview-autosize


    【解决方案1】:

    由于顶部 TextView 中文本的大小和相对位置会根据屏幕大小、方向和自动调整大小而变化,因此没有一组值可用于定位另一个两个视图并且没有任何约束可以工作,因此您必须在布局完成后使用顶部 TextViewLayout 代码来解决此问题。 Layout 将为您提供文本在 TextView 中的开始位置和结束位置的值。有关详细信息,请参见下文中的 cmets。我为演示更改了一些布局。 (这里有两种布局:一种是 ConstraintLayout,另一种是 TextView 的内部,它定义了文本的显示方式。)

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
        private TextView tv;
        private Guideline guidelineStart;
        private Guideline guidelineEnd;
        private ConstraintLayout layout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            // This is the top TextView
            tv = findViewById(R.id.timeTextView);
            
            // Get the vertical start and end guidelines which are set to 0% and 100% to start. The
            // left bottom TextView is constrained to the guidelineStart and the right bottom
            // TextView is constrained to guidelineEnd.
            guidelineStart = findViewById(R.id.guidelineStart);
            guidelineEnd = findViewById(R.id.guidelineEnd);
            
            // This is our ConstraintLayout. We will wait for everthing to layout so we can get
            // good measurements.
            layout = findViewById(R.id.layout);
            layout.post(() -> {
                int layoutWidth = layout.getWidth();
                
                // Get the starting and ending positions from the Layout of the top TextView.
                float start = tv.getLayout().getLineLeft(0);
                float end = tv.getLayout().getLineRight(0);
                
                // Now set the start and end guidelines to shift our bottom two TextViews.
                // We could also use guidelines with pixel offsets.
                guidelineStart.setGuidelinePercent(start / layoutWidth);
                guidelineEnd.setGuidelinePercent(end / layoutWidth);
            });
        }
    }
    

    activity_main.xml

    <androidx.constraintlayout.widget.ConstraintLayout 
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/black">
    
        <TextView
            android:id="@+id/timeTextView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:autoSizeMaxTextSize="5000dp"
            android:autoSizeTextType="uniform"
            android:gravity="center_horizontal"
            android:text="2:01:04"
            android:textColor="@color/textColor"
            app:layout_constraintBottom_toTopOf="@+id/guideline2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.15" />
    
        <TextView
            android:id="@+id/timeTextView2"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:text="2:01:05"
            android:textColor="@color/textColor"
            android:textSize="25sp"
            android:visibility="visible"
            app:layout_constraintStart_toEndOf="@id/guidelineStart"
            app:layout_constraintTop_toBottomOf="@id/timeTextView" />
    
        <TextView
            android:id="@+id/timeTextView3"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:text="2:01:07"
            android:textColor="@color/textColor"
            android:textSize="25sp"
            android:visibility="visible"
            app:layout_constraintEnd_toStartOf="@+id/guidelineEnd"
            app:layout_constraintTop_toBottomOf="@id/timeTextView" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineStart"
            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/guidelineEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="1.0" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    【讨论】:

    • 谢谢。它几乎可以工作。您的代码中的 timeTextView 具有固定的高度。这意味着 textSize 并没有真正适应屏幕尺寸...
    • @Ketobomb 这是对演示的简化。我更新了布局。立即尝试。
    • 事实证明,这项任务一点也不简单。虽然在手机上看起来不错,但在 2560 x 1440 平板电脑上对齐是关闭的。pasteboard.co/Kc9Qxgg.png
    • @Ketobomb 有趣。在平板电脑模拟器和实际平板电脑上为我工作。您在哪个平板电脑/模拟器上看到失败?如果 API 相关,则使用哪个 API。我在 GitHub 上加载了我的 demo project。我很想知道它是否以同样的方式失败。我做了一个小改动来适应宽度不匹配的文本视图。
    【解决方案2】:

    试试这个....

        <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:background="@color/black">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintBottom_toTopOf="@+id/guideline2">
    
        </RelativeLayout>
    
        <TextView
            android:id="@+id/timeTextView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:autoSizeMaxTextSize="5000dp"
            android:autoSizeTextType="uniform"
            android:gravity="center_horizontal"
            android:text="2:01:04"
            android:textColor="@color/white"
            app:layout_constraintBottom_toTopOf="@+id/guideline2"
            app:layout_constraintEnd_toEndOf="@+id/guideline6"
            app:layout_constraintStart_toStartOf="@+id/guideline5"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/timeTextView2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="4dp"
            android:text="2:01:05"
            android:textColor="@color/white"
            android:textSize="50dp"
            app:layout_constraintEnd_toEndOf="@+id/guideline3"
            app:layout_constraintStart_toStartOf="@+id/timeTextView"
            app:layout_constraintTop_toTopOf="@+id/guideline2" />
    
        <TextView
            android:id="@+id/timeTextView3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="4dp"
            android:gravity="end"
            android:text="2:01:07"
            android:textColor="@color/white"
            android:textSize="50dp"
            app:layout_constraintEnd_toEndOf="@+id/timeTextView"
            app:layout_constraintStart_toEndOf="@+id/timeTextView"
            app:layout_constraintStart_toStartOf="@+id/guideline3"
            app:layout_constraintTop_toTopOf="@+id/guideline2" />
       
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.59" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.75" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.5" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.1" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.9" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    这是它的外观

    希望它对你有用... :)

    【讨论】:

    • 谢谢。它几乎可以工作。屏幕尺寸为 1080x2220,顶部的大文本小于下面的 2 个文本。
    • @Ketobomb 因为你需要尝试测试不同的文本大小。
    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 2019-10-01
    • 2016-02-13
    • 2016-01-15
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多