首页 > 解决方案 > 获取 4 个按钮以具有相同的 autoSize Android (Kotlin)

问题描述

所以我正在尝试为我的 Android-App 构建一个类似于这张图片的 UI 。问题是textSize它们明显不同,因为字符串的长度不同,但我需要它们的大小相同。我找到了两个解决方案:

  1. 就这样放着吧,拿到四个size,选最小的给他们(还是用autoSizeTextType="uniform"安卓提供的a)

  2. 遍历所有按钮的文本大小,直到lineCount大于一并再次选择最小的

问题是两者都需要完全加载布局。如果它没有完全加载所有三个自动调整大小的按钮将返回相同的大小或lineCount将返回 0(我知道 StackOverflow 上有一个解决方案,但它对我不起作用)。

我知道生命周期(https://developer.android.com/guide/components/activities/activity-lifecycle)指定 Activity 应该完全加载onReasume(),但事实并非如此。

你们知道比我的两个更好的解决方案或如何让他们工作吗?

这是我的 XML 文件:

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

<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.5" />

<Button
    android:id="@+id/btn_1"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="#009688"
    android:autoSizeTextType="uniform"
    android:maxLines="1"
    android:text="12"
    app:layout_constraintBottom_toTopOf="@+id/guideline"
    app:layout_constraintEnd_toStartOf="@+id/guideline2"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/btn_2"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="#E91E63"
    android:autoSizeTextType="uniform"
    android:maxLines="1"
    android:text="Test12"
    app:layout_constraintBottom_toTopOf="@+id/guideline"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="@+id/guideline2"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/btn_3"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="#FF5722"
    android:autoSizeTextType="uniform"
    android:maxLines="1"
    android:text="Hi"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/guideline2"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/guideline" />

<Button
    android:id="@+id/btn_4"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="#673AB7"
    android:autoSizeTextType="uniform"
    android:maxLines="1"
    android:text="Hello World"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="@+id/guideline2"
    app:layout_constraintTop_toTopOf="@+id/guideline" />

主要活动:

package com.example.testsizes

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*



class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

提前致谢!

标签: androidkotlin

解决方案


要在视图对用户可见之前获取视图参数,您可以使用 OnPreDrawListener。

首先,让你的类实现 ViewTreeObserver.OnPreDrawListener -

class MyClass : ViewTreeObserver. OnPreDrawListener

暂时在你的 onResume 回调或 onCreate 中注册你的监听器 -

mYourView.viewTreeObserver.addOnPreDrawListener(this)

*最佳做法是在您的视图的 onResume 回调中注册您的侦听器,并在您的 onPause 回调中取消注册它们。

现在享受 onPreDraw 回调,在你的类上实现监听器后你被要求启动 -

override fun onPreDraw(): Boolean {
    mYourView.viewTreeObserver.removeOnPreDrawListener(this)
   // Get the params you need from mYourView

    return false
}

推荐阅读