본문 바로가기

Android_Java

Android Java 상단바(statusbar) 투명 처리

문제점 

일부 화면이 투명화면(배경이 투명으로 뒤에있는 화면이 노출됨)으로 추가됨. 기존화면에서는 상단바를 흰색배경으로 처리하고 있음. 투명화면에서도 상단바가 흰색일 경우, 화면이 종료되거나, 나타나는 시점에 흰색 상단바가 화면을 가로질러 내려가는 현상등 이질적으로 보임. 


해결방법

화면이 투명화면일 경우, 상단바도 투명으로 노출해주어, 이질감이 들지 않도록 처리.


해결과정 

https://proandroiddev.com/android-full-screen-ui-with-transparent-status-bar-ef52f3adde63

 

Android: Full Screen UI with Transparent Status Bar

Activities, the building block of any Android app. Something so simple, yet so complex. Here we are going to talk about something similar…

proandroiddev.com

위의 방식에서는 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR  를 사용하는데, 이 값을 사용하면 상단바를 밝은색으로 인식해 상단바의 글씨체가 검정색으로 됩니다.

제가 적용해야 하는 화면은 다른 앱 위에 띄워지는 화면이라 하단화면에 대한 정보를 알수가 없습니다.

하단화면의 상태바가 검정일 경우, 상단바 문구가 노출되지 않는 문제가 있어 다른 방법을 찾아야 했습니다. (검정배경에 검정글씨라.. 상단바가 이상하게 보입니다.)

 

결국 위의 방법도 내 Activity에서 상단바를 그려주는 방식이라, 이런문제가 생긴거 같아, 아예 그려주지 않는 방법을 찾아보았습니다.

https://developer.android.com/reference/android/R.attr#windowIsFloating

 

R.attr  |  Android 개발자  |  Android Developers

 

developer.android.com

windowIsFloating값을 사용할 경우, View가 차지하는 영역만을 그려주고 나머지는 그려주지 않습니다. 

주로 Dialog에서 사용하는 값인데, 이를 이용하면 가능할 것 같았습니다.

따라서 그려주는 화면을 하단 네비게이션바, 상단 상태바영역을 제외한 크기로 설정한다면, 하단 네비게이션 바와 상단 상태바 영역이 뒤에있는 화면의 것을 그대로 따라가게 됩니다.

허접한 그림


적용 결과

검은색의 상단바
하늘색의 상단바
황토색의 상단바

상단바 색상이 검정인것을 보여드리고 싶은데, 적절한 앱을 찾지 못하였네요..

하단바 색상과 상단바 색상을 하단화면의것 그대로 사용하고 있도록 개발했습니다!


적용 과정

 

style.xml

기본 앱테마 설정과, 투명화면테마에 대한 설정입니다.


<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

    <style name="AppThemeTransparent" parent="AppTheme">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

</resources>

 


 

노출 해줄 화면


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    <!-- 최상단 View id 값 세팅 -->
    android:id="@+id/root123"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="@color/colorPrimary"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent" />
        
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java


package com.example.samtest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.ViewGroup;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //반드시 setContentView가 먼저 호출되어 있어야 합니다.
        setContentView(R.layout.activity_main);

	//화면 크기를 가져와
        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics ();
        display.getMetrics(outMetrics);
        
        //layout 최상단 View의 가로 세로 크기 조절.
        ConstraintLayout view = findViewById(R.id.root123);
        ViewGroup.LayoutParams temp = view.getLayoutParams();
        temp.height = outMetrics.heightPixels;
        temp.width = outMetrics.widthPixels;
        view.setLayoutParams(temp);
    }
}

후기

이 방법이 맞는지 확신은 없지만, 결과물이 생각하던대로 나와줘서 만족스러웠습니다.

검색해서 가장 처음본 글을 적용했을때 문제가 생길수 있다고 바로 파악했던 부분이 작업시간을 많이 줄여준것 같습니다.

하단화면의 것 그대로 사용하는 Dialog에서 속성값을 찾아본게 유효했던것 같습니다.

좀 복잡하고, 코드도 손볼곳이 많아졌지만,,, 만족스럽습니다 

'Android_Java' 카테고리의 다른 글

targetSdkVersion 30 적용  (0) 2021.07.01