在运行时更改视图属性的正确方法

Proper Way of Changing View Properties at runtime

所以我有一个观点是通过 Xml 膨胀的。该视图有一个子视图,我需要设置一个具有动态值的 marginTop,如下所示:

toolbar.getHeight() - 100

因此,我无法将其设置为 xml。我可以这样做:

?attr/actionBarSize

但我特别需要 toolbar.getHeight() - 100

完成此任务的正确方法是什么?我在 activity 的 onCreate 中执行此操作,我为该视图设置了 viewTreeObserver.addOnGlobalLayoutListener,获取布局参数并添加边距。

这样做正确吗?按照我的看法,视图已绘制,当我 运行 该视图的 viewTreeObserver 中的一些代码时,必须再次重绘视图。有没有办法在不设置自定义视图的情况下避免这种双重渲染?

onCreate() 中,您可以在当前上下文中查找此属性的值:

int[] attrIds = new int[1]{ R.attr.actionBarSize };
TypedArray a = obtainStyledAttributes(attrIds);
// first argument is index in attrIds, second argument is
// a default value to return if not found
int actionBarSize = a.getDimensionPizelSize(0, 0);
a.recycle();
// do something with actionBarSize