Android 设置EditText值会导致重新测量和UI布局
我有一个相当复杂的用户界面——很多视图和相当多的层次结构。我正在努力减少这个,但我注意到了一些非常奇怪的事情 从支持模型更新UI;当模型更改时,我在后台线程中重新计算模型,然后在UI线程上,我将更新后的模型传递给各个组件以重新显示它们的信息。传递模型和进行所有(例如)textview.setText调用大约需要200-300毫秒。但是,在更新功能完成后的5秒钟内,UI实际上不会更新 我在ddms中使用了方法分析工具来查看发生了什么,在更新完成后的几秒钟内,似乎进行了大量的测量和布局调用-我在一些地方覆盖了onLayout,而且似乎即使只设置一个值也会导致整个UI重新测量和布局 所以我的问题是这是否正常,;我可以看到它需要一些时间来更新,但5秒似乎是一个很长的时间。当应用程序启动时,可能需要几秒钟才能显示UI,所以我想知道UI是否太复杂了。这是Android 4.0.4的Galaxy标签10.1Android 设置EditText值会导致重新测量和UI布局,android,android-ui,Android,Android Ui,我有一个相当复杂的用户界面——很多视图和相当多的层次结构。我正在努力减少这个,但我注意到了一些非常奇怪的事情 从支持模型更新UI;当模型更改时,我在后台线程中重新计算模型,然后在UI线程上,我将更新后的模型传递给各个组件以重新显示它们的信息。传递模型和进行所有(例如)textview.setText调用大约需要200-300毫秒。但是,在更新功能完成后的5秒钟内,UI实际上不会更新 我在ddms中使用了方法分析工具来查看发生了什么,在更新完成后的几秒钟内,似乎进行了大量的测量和布局调用-我在一些
谢谢事实证明,布局重量可能非常昂贵。应用程序的主面板由同一自定义视图的两个实例组成,使用布局权重将其一分为二:
<LinearLayout ...>
<CustomView
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1" />
<CustomView
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1" />
</LinearLayout>
此更改将对每个自定义视图的onMeasure调用的数量从4个减少到2个,这是一个显著的节约。因此,这里学到的经验是,如果视图在运行时实际上不需要调整大小,那么最好在代码中计算宽度,而不是依赖XML中的布局权重
int halfScreenWidth = ...;
for(View v : new View[]{customViewA, customViewB})
{
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) v.getLayoutParams();
lp.width = halfScreenWidth;
v.setLayoutParams(lp);
}