화면에 따라 status bar 색상을 변경하는 방법(Android JetPack/Navigation)

개시하다


화면에 따라 status bar 색상을 바꾸는 방법.
Android JetPack의 Navigation을 사용하는 경우 포커스를 기록합니다.
Navigation 사용1.0.0-alpha05.
인상은 이렇다.

샘플에 사용된 원래 응용 프로그램은 Navigation의 codelab입니다.
https://github.com/googlecodelabs/android-navigation

대응 방법


순서대로 설명하면 대응 단계는 3개다.

1. 상태 표시줄의 색상 정의


내 생각에는 여러 가지 방법이 있는데, 정리하기 편리하도록, 여기에 엔움으로 상태란의 색을 정의했다.
StatusBarColor.kt
enum class StatusBarColor(private val key: String, val color: Int) {
    BLUE("blue", android.R.color.holo_blue_dark),
    RED("red", android.R.color.holo_red_dark),
    BLACK("black", android.R.color.black);

    companion object {
        fun findByKey(key: String?): StatusBarColor =
                StatusBarColor.values().find { it.key == key } ?: BLACK
    }
}
findByKey 매개 변수는 빈 가시덤불이고 반환값이non-null이면 더욱 편리합니다.

2. 각 Fragment에서 상태 표시줄의 색상을 정의합니다.


Navigation의 xml에서 각 Fragment의argument에 상태 표시줄의 색 정보를 제공합니다.코드의 상태 표시줄 색입니다.
mobile_navigation.xml
<navigation ...>
    <fragment ...>
        <argument
            android:name="statusBarColor"
            android:defaultValue="blue"
            app:argType="string" />
        ...
    </fragment>
    <fragment ...>
        <argument
            android:name="statusBarColor"
            android:defaultValue="red"
            app:argType="string" />
        ...
    </fragment>
    ...
</navigation>
  • android:name: 코드에서argument에서 값을 추출하는 데 사용
  • android:defaultValue: 방금 정의한 StatusBarColorkey
  • 지정
  • app:argType: 문자열string로 정의합니다.처음 "s"는 소문자입니다. 주의하십시오.
  • 3. NavController에서 청중 설정


    MainActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...()
        findNavController(R.id.my_nav_host_fragment).addOnNavigatedListener { _, destination ->
            // argumentからstatus barの色情報を取得する
            val statusBarColor = StatusBarColor.findByKey(destination.defaultArguments.getString("statusBarColor"))
            // status barの色を変更
            window.statusBarColor = ContextCompat.getColor(this, statusBarColor.color)
        }
    }
    
    설정NavControllerOnNavigatedListener.이렇게 하면 Navigation의 화면 마이그레이션이 완료되면 알림을 받을 수 있습니다.이때 매개 변수는 받아들일 수 있다NavDestination.이NavDestination는 화면 이동 후의 Fragment 정보를 가지고 있으며 여기에 위에서 정의한argument도 포함한다.
    따라서 이destination에서 스트링 값을 꺼내 defaultArguments.getString로 전환한다.
    이때string값이null이거나argument에 정의되지 않았음에도 불구하고 StatusBarColor의 매개 변수는nulllable이고 반환값이nonnull이어도 편리하게 사용할 수 있습니다.
    그리고 StatusBarColor.findByKey의colorResId를 사용하여 실제 상태막대의 색을 바꾸면 완성됩니다.

    관련 링크


    Navigation 키를 사용하여 백엔드 키 조작하기

    좋은 웹페이지 즐겨찾기