Kotlin 如何获取 wrap_content TextView 的宽度

Kotlin how get width of wrap_content TextView

我有问题,因为我需要 TextView 的宽度。我已经有了布局的宽度,但我也需要有特定元素的宽度。在本例中为 TextView。我正在尝试获取它,但我认为 addOnLayoutChangeListener 正在另一个范围或某事上进行,因为当我尝试将宽度分配给 var textWidth 时,我无法执行此操作,变量 return 0,但在 println 中我可以看到有我需要的价值。我怎样才能得到这个值?

           var textWidth = 0

           textViewOne.addOnLayoutChangeListener {
                v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom
                -> textWidth = right-left
                println("${right-left}") <-- this return 389
            }
    
            println("${textWidth}") <-- this return 0

关于如何获取 TextView 的宽度的任何提示?

我认为现阶段不会评估视图尺寸,因此您别无选择,只能等到布局完全呈现。

假设您不测量单个视图,我建议将 OnGlobalLayoutListener 附加到根视图:

rootView.viewTreeObserver.addOnGlobalLayoutListener {
    // Do your thing
}

如果您希望代码只执行一次:

rootView.viewTreeObserver.addOnGlobalLayoutListener(object : OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        rootView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        // Do your thing
    }
})

如果有人需要解决方案,我刚刚解决了这个对我有用的问题:

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

    val displayMetrics: DisplayMetrics = applicationContext.resources.displayMetrics
    val pxWidth = displayMetrics.widthPixels

    val baseLayout = findViewById<LinearLayout>(R.id.baseLayout)

    baseLayout.doOnLayout {
        val textViewOne = findViewById<TextView>(R.id.textVieOne)
        val oneWidth = textViewOne.width

        val textViewTwo = findViewById<TextView>(R.id.textViewTwo)
        val twoWidth = textViewTwo.width

        val textViewThree = findViewById<TextView>(R.id.textViewThree)
        val threeWidth = textViewThree.width

        val sumOfChildWidths = oneWidth + twoWidth + threeWidth
        
        if(pxWidth <= sumOfChildWidths){
            textViewThree.isVisible = false
        }
    }
}