chacha's

💬 Popup Menu 사용하기 본문

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
 를 참고하여 작성한 게시물입니다.

아래의 코드를 실행했을 때, Popup menu view

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

Comments