2016-08-18 97 views
0

所以我有一个视图是通过Xml充气的。这种观点有一个子视图,这是我需要设置一个marginTop像这样一个动态值:在运行时更改视图属性的正确方法

toolbar.getHeight() - 100 

出于这个原因,我不能将其设置为XML。我可以这样做:

?attr/actionBarSize 

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

什么是实现这一目标的正确方法?我在活动的onCreate中做了这件事,我为该视图设置了一个viewTreeObserver.addOnGlobalLayoutListener,获取layoutParameters并添加了一个边距。

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

+0

如果工具栏的高度是固定的大小,你可以看看了'getResources(),其大小getDimensionPixelSize( ...)'并立即设置边距,而不是等待布局合格。 – Karakuri

+0

它不是。它的attr?actionBarSize –

+0

你可以在'onCreate()'中看到'obtainStyledAttributes()'。这是一个固定的大小,对于不同的配置它只是一个不同的固定大小。 – Karakuri

回答

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 
+0

这不是一个自定义的视图!我可以用globalLayout监听器以编程方式进行编程。我想知道是否有一种方法做到这一点,而没有视图绘制两次 –

+0

换句话说,我会这样做:android:layout_marginTop =“?attr/actionBarSize - xxx”但这是不可能的。此视图不是自定义视图。我想知道如果我可以做到这一点,而不使其成为一个自定义的视图,并没有双布局通过 –

+0

让我知道,如果你不明白它。 –

相关问题