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
}
}
}
我有问题,因为我需要 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
}
}
}