Android – 메뉴 만들기 with. 코틀린

옵션 메뉴와 컨텍스트 메뉴를 만들어 보겠습니다.

옵션 메뉴는 액션바(툴바)에 포함되는 메뉴를 의미하고,
컨텍스트 메뉴는 화면을 꾹 눌렀을 때 나타나는 메뉴를 의미합니다.

– 메뉴 만들기

메뉴 폴더를 만들기 위해 File-> new-> Android Resource Directory에 들어갑니다.

이후 위 화면과 같이 설정하면 res폴더에 main폴더가 생긴 것을 확인할 수 있습니다.

이번에는 메뉴 xml파일을 만들기 위해, file -> new -> menu resource file에 들어갑니다.

위 화면과 같이 설정하면 menu폴더에 main.xml이 생성됩니다.

– 코틀린에서 옵션 메뉴 제어하기

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main,menu)
return true
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main,menu) return true }
 override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main,menu) 
     return true 
  }

안드로이드에는 onCreateOptionsMenu메소드가 옵션 메뉴를 관리합니다.
오버라이딩을 통해 메뉴를 화면에 나타낼 수 있습니다.


menuInflater객체의 inflate메소드를 통해, 메뉴 리소스를 지정합니다.
(툴바에 삽입할 메뉴xml파일을 정한다는 의미)
이후 true를 반환하면 액티비티에 메뉴가 있다고 프로그램이 인식하고 툴바에 삽입이 됩니다.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item?.itemId) {
R.id.action_sha -> {
// 기능 소스
return true}
}
return super.onOptionsItemSelected(item)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean { when(item?.itemId) { R.id.action_sha -> { // 기능 소스 return true} } return super.onOptionsItemSelected(item) }
override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item?.itemId) {
             R.id.action_sha -> {
                // 기능 소스
                return true}
          }
         return super.onOptionsItemSelected(item)
}

onOptionsItemSelected메소드는 옵션 메뉴 안에 있는 메뉴 아이템을 관리합니다.
오버라이딩을 통해 메뉴 아이템을 마음대로 다룰 수 있습니다.

아이템을 다룰 때는 매개변수 item을 이용합니다. item은 MenuItem을 가리키는 참조변수입니다. 편하게 item객체라고 부르겠습니다.

우리는 item객체의 itemId필드를 이용해야 합니다. xml을 작성하면 메뉴 아이템에 id를 부여할 수 있다는 것을 알게 됩니다. 이 itemId필드는 사용자가 클릭한 아이템(id)을 토대로 값이 변한다고 생각하면 이해가 쉽습니다.

위 소스에서 R.id.action_sha ->{} 이 성립한다면, 사용자가 id가 action_sha인 아이템을 클릭했다고 생각합시다.

이벤트 처리가 끝나면 반환형이 boolean이니 ture를 반환합니다.

만약 when문에 해당되는게 없으면 원래 메소드를 호출하는게 정석입니다.

– 코틀린에서 컨텍스트 메뉴 제어하기

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
super.onCreateContextMenu(menu, v, menuInfo)
menuInflater.inflate(R.menu.context,menu)
}
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) { super.onCreateContextMenu(menu, v, menuInfo) menuInflater.inflate(R.menu.context,menu) }
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
        super.onCreateContextMenu(menu, v, menuInfo) 
        menuInflater.inflate(R.menu.context,menu) 
    }

onCreateContextMenu메소드는 컨텍스트 메뉴를 관리합니다.
오버라이딩을 통해 컨텍스트 메뉴를 지정할 수 있습니다.

원래 onCreateContextMenu를 호출하면 컨텍스트 메뉴를 만들 준비를 해줍니다.
이후 옵션 메뉴때와 같이 menuInflater.inflate메소드를 사용하여 사용할 컨텍스트 메뉴를 지정할 수 있습니다.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
registerForContextMenu()
registerForContextMenu()
registerForContextMenu()

그리고 onCreate에서, 위 코드와 같이 컨텍스트 메뉴를 등록해주어야 합니다.
인자는 컨텍스트 메뉴와 연결할 위젯이 들어갑니다.
이 작업을 통해 위젯을 꾹 클릭하면 컨텍스트 메뉴가 나오게 됩니다.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
override fun onContextItemSelected(item: MenuItem): Boolean {
when(item?.itemId){
R.id.action_share->{
// 기능 소스
return true}
}
return super.onOptionsItemSelected(item)
}
override fun onContextItemSelected(item: MenuItem): Boolean { when(item?.itemId){ R.id.action_share->{ // 기능 소스 return true} } return super.onOptionsItemSelected(item) }
override fun onContextItemSelected(item: MenuItem): Boolean {
        when(item?.itemId){
            R.id.action_share->{
                // 기능 소스
                return true}
        }
        return super.onOptionsItemSelected(item) 
    }

onContextItemSelected메소드는 컨텍스트 메뉴 아이템을 관리합니다.
오버라이딩을 통해 메뉴 아이템을 마음대로 다룰 수 있습니다.

그 방법은 onOptionsItemSelected와 동일합니다!

Leave a Reply

Your email address will not be published. Required fields are marked *