2016-08-18 2 views
0

그래서 저는 XML을 통해 팽창 된 뷰를가집니다. I XML로 설정할 수 없으며,이 때문에런타임에 뷰 속성을 변경하는 적절한 방법

toolbar.getHeight() - 100 

: 그 도면이 같은 동적 값으로 marginTop 설정해야 하위 뷰를 갖는다. 나는이 할 수있는 :

?attr/actionBarSize 

을하지만 난 특별히 toolbar.getHeight() - 100

달성이 적절한 방법은 무엇입니까해야합니까? 나는 활동의 onCreate에서 그것을하고 있는데, 나는 그보기에 viewTreeObserver.addOnGlobalLayoutListener을 설정하고, layoutParameters를 얻어 마진을 추가한다.

이렇게하는 것이 올바른 방법입니까? 내가 보는 방식으로, 뷰가 그려지며 뷰의 viewTreeObserver 내부에서 코드를 실행할 때 뷰를 다시 그려야합니다. 사용자 정의보기를 설정하지 않고이 이중 렌더링을 피할 수있는 방법이 있습니까?

+0

경우의 GetResources()'와 그 크기를 찾아 볼 수 getDimensionPixelSize을 (...)'을 선택하고 레이아웃 패스를 기다리는 대신 바로 여백을 설정합니다. – Karakuri

+0

아닙니다. 그 attr? actionBarSize –

+0

당신은'onStartedAttributes()'를'onCreate()'에서 찾을 수 있습니다. 그리고 그것은 고정 크기입니다, 그것은 다른 구성에 대해 단지 고정 된 크기입니다. – 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

당신이 그것을 이해하지 못했다면 알려주십시오. –