총 게시물 38,802건, 최근 3 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

View.post 질문 드립니다.

글쓴이 : 가가멜론 날짜 : 2017-06-15 (목) 17:57 조회 : 2227
글주소 : http://www.androidside.com/B49/167573
 
  GS fresh POST
POST, 출출할때 바로주문! 집에서도 먹고싶은 아이템, 간편한 건강 간식레시피
www.gsisuper.com
  전세계호텔초특가 인터파크투어
인터파크 20주년기념! 해외호텔 8%할인쿠폰부터 제주히든클리프 무료숙박권까지!
hotel.interpark.com
  사서함 전문, 포스토리지
우편/택배 주소변경, 개인사서함, 팬카페사서함, 개인정보보호, 보안우편함 개별제공
www.포스토리지.com
신청하기


안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang

안녕하세요.

커스텀뷰를 개발중에 궁금한점이 생겨서 질문 드립니다.

View 의 height를 변경시 v.post를 이용해야지만 적용이 되는 경우가 있던데

v.post를 사용함과 안함에 있어서 차이는 무엇인가요? 딜레이를 준것도 아니고

그냥 post 메소드로 처리 했을 뿐인데도 잘 적용이 되더라구요.

아래는 예시 소스 입니다.

layout.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(final View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
v.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
final int targetHeight = v.getMeasuredHeight();
if(v.getMeasuredHeight() != v.getHeight()) {
v.post(new Runnable() {
@Override
public void run() {
		    //post로 처리하지 않는 경우 height 변경 안됨.
v.getLayoutParams().height = v.getMeasuredHeight();
v.requestLayout();
}
});
}
}
});

고수님들의 답변 부탁드립니다.

감사합니다.



질문자가 자신의 포인트 10 점을 걸었습니다.
답변하시면 포인트 2을, 답변이 채택되면 포인트 8을 드립니다.

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

맛타 2017-06-16 (금) 13:37
이건 안드로이드 소스를 직접 보셔야할듯해요
링크 걸어드릴께요
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/View.java

Layout 변경에 따른 flag가 변하는데요
이 flag가 layout 변경과정의 상태 즉 프로세스라고 생각하시면 될것같네요(확실하지 않지만)
아무튼 제가보기엔 onLayoutChange 메소드가 호출되는 시점 이후에 flag값이 변되는데요
flag값이 변경되기 직전에 layout값이 변경되는건 무시합니다.
그래서 post는 모든 프로세스가 완료된후에 호출되기때문에 원하시는대로 동작하는것이에요

이런 프로세스가 들어간 이유는
사실 뷰의 사이즈를 가지고오고 변경하는건 자바로 만들어진게 아닙니다.
네이티브 코드로 되어있지요
이건 각 디바이스 제조사 마다 UI 인터페이스를 제공하고 안드로이드는 그걸 사용하기 때문이라 생각됩니다.

결론적으로 뷰의 사이즈 조회 및 변경은 단순히 콜하면 리턴되는 그런 형태는 아닙니다.
저도 사실 어떤 상황에는 되고 안되고가 판단이 되긴하는데 설명하기에 너무 어렵네요
(어느정도 감은 있지만 설명으로 정의하기가 좀어려움)

v.getLayoutParams().height = v.getMeasuredHeight(); 
이것은 C언어  포인터 참조로 변경되면 네이티브콜 flag값이 맞지않으면 변경하지않음 
이렇게 해석해야하나 더자세한건 소스를 참조해주세요







댓글주소 추천 0 반대 0
     
     
가가멜론 2017-06-16 (금) 18:55
소중한 답변 감사드립니다.
그렇다면 View.post 안의 코드는
해당 뷰의 모든작업 후에 호출이 되는건가요?
댓글주소 추천 0 반대 0
          
          
맛타 2017-06-16 (금) 20:37
[@가가멜론] 그렇죠 post는 UI 갱신작업이 끝난후 호출됩니다.
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기