Android Fragments 在片段中查找视图的宽度

5uzkadbs  于 2023-10-19  发布在  Android
关注(0)|答案(4)|浏览(170)

我想在一个片段中找到一个视图的宽度,我写了下面的代码

class ExampleFragment : Fragment() {

var team1_value = 0

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    val v =  inflater!!.inflate(R.layout.fragment_queens, container, false)

    val width = v.layout_team1_picker.width.toFloat()

    Log.d("width1","width is $width")

    return v
}

我得到的答案是0.0。但是如果我在按钮里面做同样的事情

class ExampleFragment : Fragment() {

var team1_value = 0

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    val v =  inflater!!.inflate(R.layout.fragment_queens, container, false)

        v.image_team1_plus.setOnClickListener{

        val width = v.layout_team1_picker.width.toFloat()

        Log.d("width2","width is $width")
    }
    return v
}

我每次按下按钮都得到正的320.0。为什么会这样呢?

d8tt03nd

d8tt03nd1#

因为在onClick的情况下,当按钮被单击时,您正在运行代码,这是在视图被打包/呈现之后。在onWebView的情况下,您在创建代码时运行代码,这是在打包/呈现之前,因此它还没有大小。
如果将显示宽度的代码从onCreateView移到onStart(在片段可见时调用),那么应该会看到所需的行为。

x6yk4ghg

x6yk4ghg2#

调用onViewCreated方法并获取内部的宽度。

g52tjvyc

g52tjvyc3#

正如其他答案中所述,在oncodeView期间,您的视图仍然没有大小。另一种方法是添加一个GlobalLayoutList,以了解视图何时被呈现。
有不同的方法来实现这一点,这里有一个很好的细分:https://antonioleiva.com/kotlin-ongloballayoutlistener/
基本上:
创建一个扩展函数到1。等待视图被渲染(通过将globalLayoutObject附加到其viewTreeObserver)2.一旦知道了宽度/高度,就可以调用任何你想要的函数

inline fun <T: View> T.afterMeasured(crossinline f: T.() -> Unit) {

    viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {

        override fun onGlobalLayout() {

            if (measuredWidth > 0 && measuredHeight > 0) {

                viewTreeObserver.removeOnGlobalLayoutListener(this)

                f()

            }

        }

    })

}

要调用它,只需执行以下操作:

v.layout_team1_picker.afterMeasured {

  Log.d("width1","width is $v.layout_team1_picker.width")

}
hgqdbh6s

hgqdbh6s4#

您需要在所有视图呈现后获取宽度,因此请使用view.post

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    // ...

    view.post {
      val width = v.layout_team1_picker.width.toFloat()
    }
  }

相关问题