在运行时更改视图属性的正确方法
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
所以我有一个观点是通过 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