개발환경 : Android JAVA + libGDX 게임엔진
구글 플레이가 targetSDK 35를 강제하면서, 가장 크게 달라진 점
Edge-To-Edge 구현하면서, 나를 지독하게 괴롭혔던 것
@Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
WindowCompat.setDecorFitsSystemWindows(getWindow(), true);
else
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
안드로이드 11, 즉 SDK.VERSION.SDK_INT가 30 (R) 이상인 경우, Edge-To-Edge를 "개발자가 구현"해야 하므로, setDecorFitsSystemWindows() 를 false로 하여야 한다.
public static void setFull(Activity activity)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Build.VERSION_CODES.R은 API 30
final WindowInsetsController insetsController = activity.getWindow().getInsetsController();
if (insetsController != null) {
insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
// WindowInsets.Type.systemBars()는 상태 바와 내비게이션 바를 모두 포함합니다.
insetsController.hide(WindowInsets.Type.systemBars());
insetsController.hide(WindowInsets.Type.displayCutout());
//insetsController.hide(WindowInsets.Type.statusBars()); // 상태 바만 숨기기
//insetsController.hide(WindowInsets.Type.navigationBars()); // 내비게이션 바만 숨기기
}
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
sendButtonParams.setMarginEnd(100); // dummy
ViewCompat.setOnApplyWindowInsetsListener(getWindow().getDecorView(), (v, insets) -> {
Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime());
int keyboardHeight = imeInsets.bottom; // 키보드는 하단에 나타나므로 bottom 값을 사용
// 키보드 높이만큼 채팅 레이아웃을 위로 이동
if (mChatLayout != null) {
mChatLayout.setTranslationY(-(float) keyboardHeight);
}
return insets;
});
}