2016-08-18 93 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

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