android - 获取 4 个按钮以具有相同的 autoSize Android (Kotlin)

标签 android kotlin

所以我正在尝试为我的 Android 应用构建一个 UI,它看起来应该与 to this picture 相似.问题是它们的 textSize 明显不同,因为字符串的长度不同,但我需要它们的大小相同。我找到了两个解决方案:

  1. 保持这样,获取四种尺寸并为它们选择最小的(仍然使用 Android 提供的 autoSizeTextType="uniform")

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

问题是两者都需要完全加载布局。如果它没有完全加载,所有三个自动调整大小的按钮将返回相同的大小,或者 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" />

主要 Activity :

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)
    }
}

提前致谢!

最佳答案

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

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

class MyClass : ViewTreeObserver. OnPreDrawListener

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

mYourView.viewTreeObserver.addOnPreDrawListener(this)

*最佳做法是在 View 的 onResume 回调中注册您的监听器,并在您的 onPause 回调中注销它们。

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

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

    return false
}

关于android - 获取 4 个按钮以具有相同的 autoSize Android (Kotlin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58899235/

相关文章:

postgresql - Heroku postgres 关系 "information_schema.session_state"不存在

java - 转换后如何修复丢失的日期时间?

android - 依赖项、模块的问题。如何正确引用该库?

android - 如何在 android 中显示 float 小部件(编辑文本和按钮)

java - 找到重复的蓝牙设备。我在这里双重浸渍吗?还能够更新 recyclerview

java - 致命异常 : RxCachedThreadScheduler-1 when trigger dispose. 为什么?

android - 如何在 Kotlin 中将 Firestore 日期/时间戳转换为日期?

Android - 列表导航样式

android - 以编程方式从Android应用程序连接到蓝牙耳机

android - 如何将 Fragment 放在 ViewPager 上