android 在充气前获取xml中的按钮大小声明

ca1c2owp  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(100)

我正在创建一个自定义按钮MyButton扩展MaterialButton。用例是,有2个大小的按钮 * 大 * 和 * 小 *,大按钮将是全宽(类似于match_parent)和小按钮将有一些minWidth让我们说100dp,最重要的是,它们将有不同的填充不同的文本大小.在为MyButton编写自定义类时,我如何检查xml中提到的layout_heightlayout_width是什么,以便我可以采取适当的操作来设置正确的UI?
我尝试获取视图的高度和宽度,但它们将是0,因为它们没有完全放置在那个时候。我也尝试使用doOnLayout{ },但这也不是在MyButton类中调用。我还尝试了button_size的自定义属性,并基于此设置布局参数,但也不起作用。
所以 * 我希望如果我能得到什么东西在xml中声明(主要是layout_width),所以我可以相应地更新其他属性。
例如

  1. open class MyButton @JvmOverloads constructor(
  2. context: Context,
  3. private val attributeSet: AttributeSet? = null,
  4. private val styleAttribute: Int = com.google.android.material.R.attr.materialButtonStyle) :
  5. MaterialButton(context, attributeSet, styleAttribute) {
  6. init{
  7. attributeSet?.let { parseAttr(it) }
  8. }
  9. private fun parseAttr(attr: AttributeSet) {
  10. if (/* need to check if the declared layout_width is match_parent*/){
  11. // set some padding and text style
  12. } else {
  13. // set some different padding and texy style
  14. }
  15. }
  16. }

字符串

vzgqcmou

vzgqcmou1#

我通常使用addOnGlobalLayoutListener在视图完全渲染后做一些事情:
像这样定义一个扩展:

  1. fun View.runOnRendered(onRendered: () -> Unit) {
  2. viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
  3. override fun onGlobalLayout() {
  4. viewTreeObserver.removeOnGlobalLayoutListener(this)
  5. onRendered()
  6. }
  7. })
  8. }

字符串
MyButton init方法中,

  1. init {
  2. runOnRendered {
  3. // Check your view width or height
  4. }
  5. }

如果您只想检查layout_widthlayout_height,而不知道其确切大小,只需检查LayoutParams即可。

  1. if (yourview.layoutParams.height == ViewGroup.LayoutParams.MATCH_PARENT) {
  2. // Do something
  3. }

展开查看全部

相关问题