[Kotlin]Activity 전체화면 처리


예전에는 뭔가 AndroidManifest.xml에서 android:theme의 설정을 조금 만져주면 되었던걸로 기억하는데(개발한지 오래되서 맞는지는..) 최근버전에서는 많이 달라진것같네요.

 

전체화면모드가 생겨서 lean back, Immersive, sticky immersive라는 3가지 옵션으로 앱의 전체화면을 컨트롤하는 모양입니다.

 

private fun fullScreen(fullScreenOption : Int) {
  window.decorView.systemUiVisibility = (
    fullScreenOption
    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_FULLSCREEN )
}​

 - fullScreenOption은 전체화면의 옵션을 설정해주기위한겁니다.

 - Immersive, sticky immersive

 - Immersive 옵션 : View.SYSTEM_UI_FLAG_IMMERSIVE

 - sticky immersive 옵션 : View.SYSTEM_UI_IMMERSIVE_STICKY

 - 위 두 옵션은 상태표시줄이나, 탐색메뉴를 없애 전체화면으로 만들어주며, 필요시 아래나 위에서 스와이프 동작을 하면 상태표시줄과 탐색메뉴가 동시에 보이게 됩니다.

 - 다만 sticky immersive옵션을 주면 상태표시줄이나, 탐색메뉴가 불투명하게 보이며, 스와이프 후 일정시간이 지나면 다시 전체화면으로 돌아가지만, Immersive옵션의 경우 스와이프 후 상태표시줄과 탐색메뉴가 불투명하지 않고, 일정시간이 지나도 계속 존재함을 확인하실 수 있습니다. (촬영 등에 탐색이벤트를 사용할일이 적은 Activity에 적합해보입니다.)

 - 만일 lean back 옵션을 주고 싶다면, fullScreenOption 매개변수를 지워주시면 됩니다. (lean back 옵션의 경우 Activity를 터치하면 상태표시줄과 탐색메뉴가 나오게됩니다. - 유저가 동영상을 보다가 어떠한 탐색 이벤트 등을 발생하고 싶을때 적합한듯 보입니다.), 아래 예시 참조

private fun fullScreen() {
  window.decorView.systemUiVisibility = (
    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_FULLSCREEN )
}

 

 - 위 함수는 onWindowFocusChanged 함수안에서 실행해주면 됩니다. (아래 예제 참조)

override fun onWindowFocusChanged(hasFocus : Boolean) {
  super.onWindowFocusChanged(hasFocus)
  if(hasFocus) fullScreen(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
}​

 - onWindowFocusChanged함수는 Activity의 선택(Focus)여부를 확인하는 함수입니다. (override하여 사용하시면 됩니다.) 

 - Activity가 포커스 되면 fullScreen이 되는 형식입니다.

 - lean back 옵션의 경우 매개변수를 넘겨주지않으면 됩니다.

  >> fullScreen()

 

 *** Reference : https://developer.android.com/training/system-ui/immersive?hl=ko

 

전체 화면 모드 사용 설정  |  Android 개발자  |  Android Developers

동영상, 게임, 이미지 갤러리, 책, 프레젠테이션 슬라이드 같은 콘텐츠를 이용하기에 최적의 환경은 전체 화면입니다. 이 페이지에서는 전체 화면에서 사용자를 콘텐츠에 더욱 몰입하게 하는 방법과 사용자가 앱을 실수로 종료하지 않도록 하는 방법을 설명합니다. 앱에 화면 공간을 최대한 활용하겠다는 단순한 이유로 전체 화면 모드를 사용 설정하려고 할 수 있습니다. 하지만 사용자가 알림 확인이나 즉흥적인 검색 등을 위해 얼마나 자주 앱을 시작하고 종료하는지 고려해야

developer.android.com

 *** 소스에 문제가 있을 시 댓글달아주시면 최신화하도록 하겠습니다. 감사합니다.

 

 


[Kotlin]안드로이드 권한 요청


 

 

권한요청은 JAVA 버전도 만들었었지만 이번에 개발하는 Kotlin(이하 코틀린)에서 사용할 권한 요청을 정리해 보았습니다. (JAVA는 추후에 다시)

 

1. JAVA와 동일하게 AndroidManifest.xml에서 권한을 요청할 permission을 지정해줍니다.

 예 ) <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

      //저장소 쓰기에 대한 권한 요청

2. PermissionCheck Class (아래 소스코드 참고)

class PermissionCheck(val permissionActivity: Activity, val requirePermissions: Array<String>) {

    private val permissionRequestCode = 100

    //권한 체크용
    public fun permissionCheck() {
        var failRequestPermissionList = ArrayList<String>()

        for(permission in  requirePermissions) {
            if(ContextCompat.checkSelfPermission(permissionActivity.applicationContext, permission) != PackageManager.PERMISSION_GRANTED) {
                failRequestPermissionList.add(permission)
            }
        }

        if(failRequestPermissionList.isNotEmpty()) {
            val array = arrayOfNulls<String>(failRequestPermissionList.size)
            ActivityCompat.requestPermissions(permissionActivity, failRequestPermissionList.toArray(array), permissionRequestCode)
        }
    }
}

 - 첫번째 매개변수는 Activity를 넘겨받으며, 두번째 매개변수는 Array 즉, 권한요청할 permission의 배열을 받아옵니다.

 - permissionCheck 함수를 돌려주면 permission 배열내에서 권한승인이 되지않은 권한을 모드 failRequestPermissionList 로 담아줍니다. 담아준 결과는 Empty 즉, 빈값이 아니라면 권한을 요청하게됩니다.

 

3. 실행할 위치에 권한요청할 permission의 Array를 생성해주고(아래 requestPermissions), PermissionCheck 클래스의 permissionCheck 함수를 실행해줍니다.

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)

  var requestPermissions = arrayOf(
  Manifest.permission.WRITE_EXTERNAL_STORAGE
  )

  val permissionCheck = PermissionCheck(this, requestPermissions)
  permissionCheck.permissionCheck()
}

 

** 만일 permissionCheck 함수를 실행하지 않고 바로 실행하고 싶다면 init 활용 (아래 참조)

class PermissionCheck(val permissionActivity: Activity, val requirePermissions: Array<String>) {

    private val permissionRequestCode = 100

    //권한 체크용
    init {
        var failRequestPermissionList = ArrayList<String>()

        for(permission in  requirePermissions) {
            if(ContextCompat.checkSelfPermission(permissionActivity.applicationContext, permission) != PackageManager.PERMISSION_GRANTED) {
                failRequestPermissionList.add(permission)
            }
        }

        if(failRequestPermissionList.isNotEmpty()) {
            val array = arrayOfNulls<String>(failRequestPermissionList.size)
            ActivityCompat.requestPermissions(permissionActivity, failRequestPermissionList.toArray(array), permissionRequestCode)
        }
    }
}

 -> 사용시에는 아래처럼 PermissionCheck 클래스에 매개변수만 담아주면 권한체크가 실행됩니다.

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)

  var requestPermissions = arrayOf(
  Manifest.permission.WRITE_EXTERNAL_STORAGE
  )

  PermissionCheck(this, requestPermissions)
}

 

*** Reference : https://developer.android.com/training/permissions/requesting?hl=ko

*** 소스에 문제가 있을 시 댓글 달아주시면 최신화하도록하겠습니다.

+ Recent posts