Android/My Library
💬 Popup Menu 사용하기
Cha_Cha
2021. 11. 23. 20:26
How change position of popup menu on android overflow button? - stack overflow
Popup menu with icons - Android Code Snippets
를 참고하여 작성한 게시물입니다.
1. menu 리소스 작성하기
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/list_action_delete"
android:icon="@drawable/ic_delete"
android:title="delete" />
<item
android:id="@+id/list_action_rename"
android:icon="@drawable/ic_rename"
android:title="rename" />
</menu>
2. popup menu style 리소스 정의하기
// res/menu/pop_up_menu.xml
<style name="PopupMenuStyle" parent="Widget.AppCompat.PopupMenu.Overflow">
<item name="android:itemBackground">@color/colorSecondary</item>
</style>
3. Activity/Fragment에서 Popup menu 보여주기
아래의 코드는 Fragment에서 popup menu를 보여주는 코드입니다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
MusicAdapter.DeleteItemListener { view, item ->
// Long 클릭 시 해당 Item 지우기
showPopupMenu(view, item)
true
}
...
}
// popup menu 보여주는 method
private fun showPopupMenu(view: View?, item: MusicItem) {
// popoup menu 에 적용할 style
val contextThemeWrapper =
ContextThemeWrapper(requireContext(), R.style.PopupMenuStyle)
// popup menu 가 보일 위치
val popupBase =
(view as MaterialCardView).findViewById<TextView>(R.id.pupup_container)
// popup menu 선언
val popupMenu = PopupMenu(contextThemeWrapper, popupBase)
popupMenu.menuInflater.inflate(R.menu.pop_up_menu, popupMenu.menu)
popupMenu.setOnMenuItemClickListener { m ->
when (m.itemId) {
R.id.list_action_delete -> androidViewModel.removeFile(item.absolutePath)
R.id.list_action_rename -> androidViewModel.renameFile(item.absolutePath)
}
false
}
// Icon 보여주기
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
popupMenu.setForceShowIcon(true)
} else {
try {
val fields = popupMenu.javaClass.declaredFields
for (field in fields) {
if ("mPopup" == field.name) {
field.isAccessible = true
val menuPopupHelper = field[popupMenu]
val classPopupHelper = Class.forName(menuPopupHelper.javaClass.name)
val setForceIcon: Method = classPopupHelper.getMethod(
"setForceShowIcon",
Boolean::class.javaPrimitiveType
)
setForceIcon.invoke(menuPopupHelper, true)
break
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
popupMenu.show()
}
END