간단한 셀렉트 박스를 만들기 위해서 팝업 메뉴를 사용하여 구현도중 선택된 메뉴에는 이미지를 추가로 넣어줘야 하는 일이 생겼다.
코드
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()
}
결과물
'TeamProject > ImadAndroid' 카테고리의 다른 글
| [android] 텍스트 뷰 이미지 추가 (0) | 2025.02.05 |
|---|---|
| DialogFragment 등장 퇴장 애니메이션 적용 [Kotlin] (0) | 2024.12.24 |
| 이미지가 가로로 로드 되는 경우 (0) | 2024.08.09 |
| Fragment에서 menuInflater 사용 (0) | 2024.07.04 |
| 리사이클러뷰 스크롤시 페이지 요청 (0) | 2024.04.24 |
댓글