【问题标题】:Proper Way of Changing View Properties at runtime在运行时更改视图属性的正确方法
【发布时间】:2016-08-19 00:00:48
【问题描述】:

所以我有一个通过 Xml 膨胀的视图。该视图有一个子视图,我需要使用这样的动态值设置一个marginTop:

toolbar.getHeight() - 100

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

?attr/actionBarSize

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

实现此目的的正确方法是什么?我在活动的 onCreate 中执行此操作,我为该视图设置了 viewTreeObserver.addOnGlobalLayoutListener,获取 layoutParameters 并添加边距。

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

【问题讨论】:

  • 如果工具栏高度是固定大小,您可以使用getResources().getDimensionPixelSize(...) 查找该大小并立即设置边距,而不是等待布局通过。
  • 不是。它的吸引力?actionBarSize
  • 您可以在onCreate() 中查找obtainStyledAttributes()。这是一个固定尺寸,只是不同配置的不同固定尺寸。

标签: android view layoutparams


【解决方案1】:

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

【讨论】:

  • 这不是自定义视图!我可以使用 globalLayout 侦听器以编程方式进行。我想知道是否有办法在没有两次视图绘制的情况下做到这一点
  • 换句话说,我会这样做:android:layout_marginTop="?attr/actionBarSize - xxx" 但这是不可能的。此视图不是自定义视图。我想知道我是否可以在不使其成为自定义视图且没有双重布局通行证的情况下做到这一点
  • 如果您不理解,请告诉我。
  • @user3806331 你误会了。这里没有关于自定义视图的内容。 obtainStyledAttributes(...)Context 的一个方法,你可以在你的 ActivityonCreate() 里面做这个。
  • 这不是问题。我知道如何在运行时获取 actionBarSize attr。我的问题是如何为通过 XML 定义的视图(将是 actionBarSize - xxx)添加边距,而无需重绘视图两次。 @Karakuri
猜你喜欢
  • 2010-11-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2021-01-21
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多