지난 글 onCreateDialog/onPrepareDialog 에 이어

 

Custom dialog의 위치와 크기 변경에 대해 알아보도록 하겠습니다.

 

이전 글의 맥락을 같이 하기 위해,

onCreateDialog( ... ) 또는 onPrepareDialog( ... ) 메서드에서 변경을 가하도록 합니다.

 

각 dialog id마다 위치/크기가 모두 다르다 하면 각 분기문 안에서 해주시면 될듯하고,

공통분모가 있다면 역시나 맨 끝에 id 구별 없이 해주시면 될듯 합니다.

 

먼저 인자로 넘어온 dialog가 있으니 우린 이 dialog를 잘 요리해주면 됩니다.

자세히 찾아보진 않았지만 Dialog 클래스는 View class를 상속받고 있지 않네요,

View의 계층 구조로 보았을 때 graphics 계열이지만 Dialog는 app 계열입니다.

고로 해당 LayoutParam를 사용하기 위해 View에서는 getLayoutParams() 를 사용했지만,

DIalog의 LayoutParam을 사용하기 위해서는 Dialog의 getWindow()를 통해

해당 window를 참조해서 getAttributes()를 통해 받아와야합니다.

 

복잡해 보이지만 실지론 한줄로 표현이 됩니다.

LayoutParams dialogLP = dialog.getWindow().getAttributes();

 

이렇게 LayoutParam을 받고 나면 조절하는거야 .찍어보면 eclipse의 훌륭한 assist 기능으로 쉽게 알 수 있는데요,

다음을 주의해서 코딩하시면 삽질을 꽤나 많이 줄일 수 있을 것입니다.

 

1. dialog는 width/height가 wrap_content / wrap_content 입니다.

2. dialog는 기본적으로 layout_gravity가 center 정렬입니다.

 

위 주의 사항중 1은 크게 어렵지 않게 해결되었지만 2번 좌표 이동은 생각처럼 잘 안되더라구요(처음엔)

 

모든 기기에 맞는 좌표 이동을 원했기 때문에 y축 이동이 필요했습니다.

(x축은 해상도 따라 비율로 크거나 작아지게만 하면 가운데 정렬이니 좌표를 변경할 필요는 없었습니다.)

 

결국 삽질 끝에 이런 방법이 생겼습니다.

 

1. 기준이 되는 해상도의 이동 좌표를 정함 (예를 들어 1280*720 기준, y축 위로 280px 올라간 dialog)

2. 현재 디바이스의 세로 해상도( deviceHeight ) 를 1280과 비교해 비율을 얻어냄. ( heightRate )

3. 마지막으로 dialogLP.y = Math.round( 280 * heightRate ) - (( deviceHeight - dialogLP.height ) / 2);

 

이렇게 하면 해결이 되더군요 ~_~

 

 


 

한가지 더 중요한 팁이 있는데요, (팁이라기보다는 삽질 미연 방지)

onPrepareDialog( ... ) 에서 크기나 위치를 변경할 경우,

현재 dialog의 값을 참조한 상태로 변경하지 않아야 한다는 것입니다.

 

onCreateDialog에서야 한번 하고 마니 상관 없지만,

onPrepareDialog에서 하면 호출될 때마다 매번 위치/크기가 계속 더해지고 빼지고 하면서 변경되거든요.. ^^;

 


(2016.09.26) 오랜만에 보니 말이 이상하네요 ㅜㅜ 아래 글은 다음에 기회 될 때 올바르게 수정해두겠습니다.

덧붙여 한가지 더!

이렇게 생성된 dialog에서는 onBackPressed 이벤트를 받지 않습니다.

따라서 onBackPressed가 먹히지 않게 하시려면 먹지 않게 할 dialog를 생성할 때

고정적이라면 onCreateDialog에서 dialog.setCancelable( false ) 로 설정해주시면 됩니다.


'Android' 카테고리의 다른 글

Adjusting Touch Area  (0) 2012.10.16
Android GCM 가이드 따라하다 삽질한 기억  (0) 2012.10.09
Avoding memory leaks  (0) 2012.09.10
onCreateDialog/onPrepareDialog  (8) 2012.09.06
안드로이드 성능 개선  (0) 2012.08.31
Posted by 독뽀
,