我想在一个片段中找到一个视图的宽度,我写了下面的代码
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。为什么会这样呢?
4条答案
按热度按时间d8tt03nd1#
因为在onClick的情况下,当按钮被单击时,您正在运行代码,这是在视图被打包/呈现之后。在onWebView的情况下,您在创建代码时运行代码,这是在打包/呈现之前,因此它还没有大小。
如果将显示宽度的代码从
onCreateView
移到onStart
(在片段可见时调用),那么应该会看到所需的行为。x6yk4ghg2#
调用
onViewCreated
方法并获取内部的宽度。g52tjvyc3#
正如其他答案中所述,在oncodeView期间,您的视图仍然没有大小。另一种方法是添加一个GlobalLayoutList,以了解视图何时被呈现。
有不同的方法来实现这一点,这里有一个很好的细分:https://antonioleiva.com/kotlin-ongloballayoutlistener/
基本上:
创建一个扩展函数到1。等待视图被渲染(通过将globalLayoutObject附加到其viewTreeObserver)2.一旦知道了宽度/高度,就可以调用任何你想要的函数
要调用它,只需执行以下操作:
hgqdbh6s4#
您需要在所有视图呈现后获取宽度,因此请使用view.post