事实证明,layout_weight 可能非常昂贵。应用程序的主面板由同一个自定义视图的两个实例组成,使用 layout_weight 将其分成两半:
<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 调用,onMeasure 在每个自定义视图上都被调用了 4 次。每个 onMeasure 调用大约需要 300-400 毫秒(正如我提到的,这是一个复杂的布局),这导致整个视图实际布局需要 3 秒以上。
任何时候视图发生变化(比如当编辑文本添加了一些文本)时,自定义视图的宽度都会根据权重进行更新。由于我只是使用权重来设置设备上的初始大小,并且每个自定义视图都无法调整其大小(因为它们都是屏幕宽度的一半),我删除了自定义视图上的 layout_weight 属性并添加了这对 onCreate 中的代码:
int halfScreenWidth = ...;
for(View v : new View[]{customViewA, customViewB})
{
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) v.getLayoutParams();
lp.width = halfScreenWidth;
v.setLayoutParams(lp);
}
此更改将每个自定义视图的 onMeasure 调用次数从 4 次减少到 2 次,节省了大量资金。所以这里学到的教训是,如果视图在运行时不需要调整大小,最好在代码中计算宽度,而不是依赖 XML 中的 layout_weight。