본문 바로가기
TeamProject/ImadAndroid

안드로이드 팝업 메뉴에 이미지 추가 [Kotlin]

by 둥글레차35 2024. 12. 20.

간단한 셀렉트 박스를 만들기 위해서 팝업 메뉴를 사용하여 구현도중 선택된 메뉴에는 이미지를 추가로 넣어줘야 하는 일이 생겼다.

 

코드

var selectedItemId: Int? = R.id.aaa // 처음 이미지를 적용할 메뉴의 아이디 혹은 적용 x 시 null


private fun searchType() {
        // search_type 클릭 리스너
        search_type.setOnClickListener {
        // 팝업 메뉴 객체 생성 및 메뉴 리소스 연결
            val popupMenu = PopupMenu(requireContext(), search_type)
            popupMenu.menuInflater.inflate(R.menu.search_type, popupMenu.menu)

            // 이전에 선택된 메뉴에 이미지
            selectedItemId?.let { id ->
                popupMenu.menu.findItem(id).setIcon(R.drawable.checkcheck)
            }

            //팝업 메뉴 리스너
            popupMenu.setOnMenuItemClickListener {
                // 기존 아이콘 제거
                selectedItemId?.let { id ->
                    popupMenu.menu.findItem(id).icon = null
                }

                it.setIcon(R.drawable.checkcheck) // 눌렸을시 해당 부분에 아이콘 할당
                selectedItemId = it.itemId //팝업 메뉴 아이디 할당

                when (it.itemId) {
                    R.id.title_detail -> {
                        search_type.text = it.title
                        return@setOnMenuItemClickListener true
                    }
                    R.id.2 -> {
                        search_type.text = it.title
                        return@setOnMenuItemClickListener true
                    }
                    R.id.3 -> {
                        search_type.text = it.title
                        return@setOnMenuItemClickListener true
                    }
                    R.id.4 -> {
                        search_type.text = it.title
                        return@setOnMenuItemClickListener true
                    }
                    else -> return@setOnMenuItemClickListener false
                }
            }
            // 팝업 매뉴 내부에서 아이콘 사용을 하기 위한 부분
            try {
                val field = popupMenu.javaClass.getDeclaredField("mPopup")
                field.isAccessible = true
                val menuPopupHelper = field.get(popupMenu)
                menuPopupHelper.javaClass.getDeclaredMethod("setForceShowIcon", Boolean::class.java)
                    .invoke(menuPopupHelper, true)
            } catch (e: Exception) {
                e.printStackTrace()
            }
            popupMenu.show()
        }

    }

 

 

팝업 메뉴의 선택된 항목의 아이디를 저장하고 다시 메뉴를 띄울 때 해당 아이디의 항목쪽에 이미지를 넣어주는 방식으로 구현 하였다.

우선 클릭시 메뉴를 열어줄 부분을 setOnclickListener을 설정하고

해당 부분 안에서 팝업메뉴 객체 생성및 미리 만들어둔 메뉴 리소스 파일을 연결 시켜주었다.

그리고 selectedItemId가 null이 아닌 경우에는 해당 아이디의 항목 부분에 미리 설정한 이미지를 넣어서 보여주도록 만들었다.

 

 

마지막으로 

해당 부분의 경우에는 기본적으로 팝업 메뉴의 항목에는 이미지를 사용할 수 없도록 강제로 막아두었기 때문에 이를 강제로 표시하기 위한 방법이다.

try {
    val field = popupMenu.javaClass.getDeclaredField("mPopup")
    field.isAccessible = true
    val menuPopupHelper = field.get(popupMenu)
    menuPopupHelper.javaClass.getDeclaredMethod("setForceShowIcon", Boolean::class.java)
        .invoke(menuPopupHelper, true)
} catch (e: Exception) {
    e.printStackTrace()
}

 

결과물

 

댓글