안드로이드 프로그래밍에서 어플만의 UI를 갖는것은 필수라고 생각한다.

 앱의 기능은 구글링을 통해서 어느정도 구현을 할 수가 있는데, 똑같은 기능을 갖고 있는 앱 중에서 UI가 이쁜 앱과 UI가 평범한 앱중에는 당연히 UI가 이쁜 앱을 쓰지 않을까??

 독특한 특색을 갖는 UI를 꾸미기 위해서 이번에는 액션바를 활용해 보겠다. (커스텀하게 액션바를 만드는 내용은 다음에 시간날때 올리도록 하겠다..)


 글쓴이의 경우 앱에 액션바를 사용하였는데 액션바에 배경이미지를 넣고 사용하기 위해 커스텀하게 구현을 하였다. 버튼역시 테마에 맞게 이미지를 넣어 구현을 하였다. 


 이때 문제가 발생하였는데 이미지를 넣은 버튼을 배치했을 때 디바이스에 따라 해상도가 모두 다르기 때문에 버튼의 크기가 제 각각 이었다. 

 액션바의 크기는 모든 디바이스에서 비율이 똑같을 것이라고 생각하고 크기를 절대값으로 조절하였더니 문제가 생긴것이다. 해상도에 따라서 액션바의 크기도 제각각이었다. 그래서 액션바의 크기를 구해서 버튼크기를 조절하려고 했다. 그러나 액션바의 크기가 0으로 나와서 크기를 알 수 가 없었다.

 그렇다.. 액션바의 크기는 0이었던 것이다.. 

 하지만 액션바의 크기를 구할 수 있는 방법이 있다!!

 액티비티가 실행될 때 onCreate 안에서 액션바의 크기를 구하면 0이 나오지만, 스레드를 이용하면 크기를 구할수 있다.

 일단 Action Bar 와 Status Bar 크기를 구하는 코드부터 살펴보자


private void getStatusBarSize() {
	Rect rectgle = new Rect();
	Window window = getWindow();
	window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
	int StatusBarHeight = rectgle.top;
	int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
	int TitleBarHeight = contentViewTop - StatusBarHeight;
	
	Log.i("getHeight", "StatusBar Height= " + StatusBarHeight + " TitleBar Height = " + TitleBarHeight);
}

위의 메소드를 onCreate 안에서 호출하지말고 스레드를 통해서 호출한다.


@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

	LinearLayout layout = new LinearLayout(this);
	layout.post(new Runnable() {
		@Override
		public void run() {
			getStatusBarSize();
		}
	});
}


스레드를 통해서 getStatusBarSize를 호출하면 크기를 구할 수 있다.


여기서 또 한가지 팁은 액션바 사이즈를 구해서 액션바 사이즈를 이용해서 액션바에 들어가는 버튼이나 이미지 크기를 조절하려면 onCreate안에서 계산하면 안된다. 스레드를 통해서 크기를 구하기 때문에 onCreate가 끝나고 크기가 구해질 수 가 있기 때문에 액션바에 들어가는 버튼의 크기를 조절하고자 한다면 스레드 안에서 getStatusBarSize()를 호출하고 난 뒤에 크기를 조절해 주도록 하자!


액션바를 커스텀하게 만드는 방법은 다음에 자세히 포스팅 하도록 하겠다.


+ Recent posts