본문 바로가기
2022년

Context Menu

by 박상윤 2021. 10. 18.

- 화면에 배치된 View에 설정할 수 있는 메뉴

- 메뉴가 설정된 View를 길게 누르면 메뉴가 나타난다.

registerForContext

- Context Menu를 등록하는 메서드

- 메서드의 매개 변수로 넣어준 View 객체에 메뉴가 설정된다.

 

onCreateContextMenu

- View를 길게 누르면 호출되는 메서드

- 여기에서 메뉴를 구성한다.

 

package com.sypark.contextmenu

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ContextMenu
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

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

        //Context메뉴를 View에 등록한다.
        registerForContextMenu(textView)
    }

    override fun onCreateContextMenu(
        menu: ContextMenu?,
        v: View?,
        menuInfo: ContextMenu.ContextMenuInfo?
    ) {
        super.onCreateContextMenu(menu, v, menuInfo)
        // 길게 누른 View의 id로 분기한다
        when(v?.id){
            R.id.textView -> {
                menu?.setHeaderTitle("텍스트뷰의 메뉴")
                menuInflater.inflate(R.menu.menu1,menu)
            }
        }
    }
}

override fun onContextItemSelected(item: MenuItem): Boolean {

        // 메뉴의 id값으로 분기
        when(item.itemId){
            R.id.text_item1 -> {
                textView.text = "텍스트 뷰의 메뉴1을 눌렀습니다"
            }
            R.id.text_item2 -> {
                textView.text ="텍스트 뷰의 메뉴2를 눌렀습니다"
            }
        }

        return super.onContextItemSelected(item)
    }

ListView ContextMenu적용

class MainActivity : AppCompatActivity() {

    val data1 = arrayOf(
        "항목1","항목2","항목3","항목4","항목5"
    )

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

        val adapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,data1)

        list1.adapter = adapter

        list1.setOnItemClickListener { adapterView, view, i, l ->
            textView.text = "리스트 뷰의 항목 클릭:${data1[i]}"
        }

        //Context메뉴를 View에 등록한다.
        registerForContextMenu(textView)
        registerForContextMenu(list1)
    }

    override fun onCreateContextMenu(
        menu: ContextMenu?,
        v: View?,
        menuInfo: ContextMenu.ContextMenuInfo?
    ) {
        super.onCreateContextMenu(menu, v, menuInfo)
        // 길게 누른 View의 id로 분기한다
        when(v?.id){
            R.id.textView -> {
                menu?.setHeaderTitle("텍스트뷰의 메뉴")
                menuInflater.inflate(R.menu.menu1,menu)
            }
            R.id.list1 -> {
                //사용자가 길게 누른 항목 인덱스 번호를 파악
                val info = menuInfo as AdapterView.AdapterContextMenuInfo

                menu?.setHeaderTitle("리스트뷰의 메뉴:${info.position}")
                menuInflater.inflate(R.menu.menu2,menu)
            }
        }
    }

override fun onContextItemSelected(item: MenuItem): Boolean {

        // 리스트 항목의 인덱스 번호를 받을 변수
        var position = 0

        when(item.itemId){
            R.id.list_item1,R.id.list_item2 -> {
                //MenuInfo객체를 추출한다.
                var info = item.menuInfo as AdapterView.AdapterContextMenuInfo
                position = info.position
            }
        }

        // 메뉴의 id값으로 분기
        when(item.itemId){
            R.id.text_item1 -> {
                textView.text = "텍스트 뷰의 메뉴1을 눌렀습니다"
            }
            R.id.text_item2 -> {
                textView.text ="텍스트 뷰의 메뉴2를 눌렀습니다"
            }
            R.id.list_item1 -> {
                textView.text = "리스트 뷰의 메뉴1을 눌렀습니다 : $position"
            }
            R.id.list_item2 -> {
                textView.text = "리스트 뷰의 메뉴2를 눌렀습니다 : $position"
            }
        }

        return super.onContextItemSelected(item)
    }

'2022년' 카테고리의 다른 글

Activity  (0) 2021.10.20
Popup Menu  (0) 2021.10.19
Option Menu  (0) 2021.10.18
권한  (0) 2021.10.18
RecyclerView  (0) 2021.10.11