Android View的.onMeasure副作用

时间:2018-03-29 21:56:42

标签: android android-layout android-measure

我遇到了g = nx.from_pandas_edgelist(df, 0, 1) 以某种方式改变视图状态的问题。

我已经设置了一个监听.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)事件并执行onClick的视图。请注意,当我在.measure中直接执行此操作时,它不会发生。

我希望此代码只能用绿色重新绘制onCreate,而不是更改任何位置。

简单视图:

enter image description here

点击后的相同视图。注意位置是如何关闭的:

enter image description here

活动:

textView

布局:

class Main2Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)
        setSupportActionBar(toolbar)

        val root = findViewById<ConstraintLayout>(R.id.foo)
        val tv = root.findViewById<TextView>(R.id.bar)
        tv.setOnClickListener {
            tv.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
            tv.setTextColor(resources.getColor(R.color.green))
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可能不想首先致电measure()。系统应该为您照顾。请继续删除该电话。

如果您遗漏了某些问题,并且您绝对必须致电measure(),那么您需要确保传递正确的参数。 The documentation for View.measure()指定您必须传递&#34;测量规格&#34;, LayoutParams常量。也就是说,而不是你拥有的东西,你会传递看起来像这样的东西:

tv.measure(View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.EXACTLY),
           View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.EXACTLY));

View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.EXACTLY)ViewGroup.LayoutParams.MATCH_PARENT都属于int类型,这就是编译器没有抱怨并且应用程序没有崩溃的原因。但是,您无法将任何旧int传递给此方法。

但请注意,此调用的显式目的是更改视图的布局。因此,如果您调用measure,那么您将更改视图的布局,因为这就是它所做的

  

请注意,当我在onCreate中直接执行此操作时,它不会发生。

我不确定,但我怀疑这是因为您在measure()的{​​{1}}手动拨打之前系统启用了视图布局期间onCreate(),因此修改后的结构会被抛弃。当您在measure()中执行此操作时,您的手动呼叫将排在第二位,并覆盖系统发起的呼叫。