Deperecated/Android_강의

안드로이드 - ContextMenu

누알라리 2020. 2. 13. 20:41
1. ContextMenu란?

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

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

 

- 길게 눌러야 나오기 때문에 직관적인 메뉴가 아니고, 보통 리스트뷰에 넣어서 나온다.

 

2. registerForContext

- 컨텍스트 메뉴를 등록하는 메서드

- 메서드의 매개 변수로 넣어준 뷰 객체에 컨텍스트 메뉴가 설정된다.

 

3. onCreateContextMenu

- 뷰를 길게 누르면 컨텍스트메뉴가 호출되는 메서드

- 여기에서 컨텍스트 메뉴를 구성한다.

 

4. OnContextItemSelected

- 사용자가 메뉴를 선택했을 때 호출되는 메서드

 

5. 생성 순서

1. 컨텍스트 메뉴를 뷰에 세팅

        // 1. 컨텍스트 메뉴를 뷰에 세팅
        registerForContextMenu(textView)
        registerForContextMenu(listview)

 

2. 길게 누른 View를 찾아 컨텍스트 메뉴 구성

- 만약 리스트뷰의 항목마다 컨텍스트 메뉴를 다르게 하고싶다면, 선택한 항목이 리스트뷰의 몇번째 항목인지는 menuInfo 매개변수로 넘어온다. 

- menuInfo를 AdapterView.AdapterContextMenuInfo를 형 변환해서 position을 얻어온다.

    // 두번째 매개변수가 유저가 길게 누른 View.
    // 만약에 리스트뷰의 항목마다 컨텍스트메뉴를 다르게 가고싶다면, 선택한 항목이 리스트뷰의 몇번째 항목인지는 menuInfo 매개변수로 넝머온다.
    override fun onCreateContextMenu(
        menu: ContextMenu?,
        v: View?,
        menuInfo: ContextMenu.ContextMenuInfo?
    ) {
        super.onCreateContextMenu(menu, v, menuInfo)

        when(v?.id)
        {
            R.id.textView -> {
                menu?.setHeaderTitle("텍스트뷰의 메뉴") // 컨텍스트뷰의 제목
                menuInflater.inflate(R.menu.textview_menu, menu) // xml파일로 만들어준 menu
            }
            R.id.listview ->
            {
                menu?.setHeaderTitle("리스트뷰의 메뉴")
                menuInflater.inflate(R.menu.listview_menu,menu)

                // 사용자가 길게누른 리스트뷰의 항목
                var info = menuInfo as AdapterView.AdapterContextMenuInfo
                if(info.position % 2 == 0)
                {
                    // 짝수번째 리스트뷰 항목을 눌렀을 때 메뉴를 3개로 추가시킨다.
                    menu?.add(Menu.NONE, Menu.FIRST + 100, Menu.NONE, "리스트뷰 메뉴3")
                }
            }

        }
    }

 

3. 선택된 컨텍스트 메뉴에 따른 반응 세팅

- 리스트뷰의 몇 번째 항목이 선택되었는지는 item의 menuInfo를 AdapterContextMenuInfo로 캐스팅해서 사용한다.

 

    // 사용자가 길게 누른 View객체의 주소값이 넘어오지 않는다.
    // 따라서 메뉴 아이템의 id값을 다 다르게 만들어야 여기서도 알 수 있다.

    // 이 함수에서 사용자가 누른 리스트뷰가 몇 번째 항목인지 알려면!
    override fun onContextItemSelected(item: MenuItem): Boolean {

        when(item?.itemId)
        {
            R.id.textview_Item1 ->
                textView.text = "존예"
            R.id.textview_Item2 ->
                textView.text = "지존"
            R.id.listview_item1 ->
            {
                textView.text = "리스트뷰_존예"

                var info = item?.menuInfo as AdapterView.AdapterContextMenuInfo
                textView.append("${info.position}째 항목")
            }

            R.id.listview_item2 ->
            {
                textView.text = "리스트뷰_지존"
                var info = item?.menuInfo as AdapterView.AdapterContextMenuInfo
                textView.append("${info.position}째 항목")
            }
        }

        return super.onContextItemSelected(item)
    }

'Deperecated > Android_강의' 카테고리의 다른 글

안드로이드 - ActionBar  (0) 2020.02.13
안드로이드 - PopupMenu  (0) 2020.02.13
안드로이드 - 메뉴 - OptionMenu  (0) 2020.02.12
안드로이드 - ViewPager  (1) 2020.02.12
안드로이드 - Spinner  (0) 2020.02.12