본문 바로가기
Android

[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 20 - WindowInsetsController,

by 들풀민들레 2022. 5. 9.

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.

 

 

본 글은 [깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책 혹은 인강(www.ssamz.com)을 통해 확인해 주세요.

 

10.4.2. 화면 방향과 전체화면


화면 방향
스마트폰은 사용자가 기기를 회전함에 따라 화면이 자동으로 회전합니다. 그런데 앱을 작성하다 보면
화면을 세로나 가로 방향으로 고정해야 할 때가 있습니다. 액티비티의 screenOrientation 속성만으로
쉽게 액티비티의 방향을 고정할 수 있습니다.

 

<activity
android:name=".KeyboardActivity"
android:exported="true"
android:screenOrientation="portrait">

그런데 만약 액티비티의 사용자에 의한 화면 회전이 가능한 상황이라면 화면이 회전되는 순간을 자바
코드에서 감지할 수 있을까요? 이를 지원하기 위한 속성이 configChanges입니다.

 

<activity
android:name=".KeyboardActivity"
android:exported="true"
android:configChanges="orientation|screenSize">

configChanges 속성은 액티비티의 각종 환경이 변경되었을 때 액티비티의 콜백 함수를 호출하기 위해
사용됩니다. 다음은 이 속성값으로 orientation|screenSize를 지정하여 화면이 회전할 때 콜백 함수가
호출되게 하는 코드입니다.

 

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
	super.onConfigurationChanged(newConfig);
	if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
		Log.d("kkang","portrait......");
	}else {
		Log.d("kkang","landscape.....");
	}
}

configChanges 속성에 의해 등록된 환경이 변경되는 순간 호출되는 액티비티의 콜백 함수는
onConfigurationChanged()입니다.


액티비티를 전체화면으로 표시한다는 것은 액티비티의 콘텐츠 영역을 화면 전체에 나오게 한다는
의미입니다. 액션바는 출력되지 않으며, 액티비티의 내용이 상태바(status bar)의 영역까지 차지하도록
화면을 구성합니다.

 

액티비티를 전체화면으로 설정하기 위해서는 먼저 액티비티의 액션바가 출력되지 않도록 테마를
적용해야 합니다.

 

<activity
android:name=".KeyboardActivity"
android:exported="true"
android:theme="@style/Theme.MaterialComponents.DayNight.NoActionBar">

그리고 화면 상단의 시간이 나오는 상태바 영역과 화면 하단의 시스템 버튼이 출력되는 네비게이션바
영역에 윈도우 내용이 나오도록 코드에서 제어해주어야 합니다.
제어하는 방법은 API Level 30에서 변경되었습니다. API Level 29까지는 Window 객체의
setFlags () 함수를 이용하였지만 deprecated 되었으며, 30버전부터 WindowInsetsController
객체에 의해 설정됩니다.

 

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
	Window window = getWindow();
	WindowInsetsController controller = window.getInsetsController();
	if(controller != null){
		controller.hide(WindowInsets.Type.statusBars()|WindowInsets.Type.navigationBars());
	}else {
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
			WindowManager.LayoutParams.FLAG_FULLSCREEN);
	}
}

 

위의 코드에서 WindowInsetsController 객체의 hide ( ) 함수로 윈도우에 기본으로 출력되는
상태바와 네비게이션바가 나오지 않도록 설정했습니다. hide () 함수에 WindowInsets.Type.statu
sBars ()|WindowInsets.Type.navigationBars ()로 지정하여 설정했으며, 원한다면 이 중 하나만
지정해도 됩니다.

 

 

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.