Yeon DevLog

Android Studio/Front

[Android Studio][Kotlin] Custom Popup Menu

devYeON_ 2022. 1. 25. 22:16

Fragment의 RecyclerView에 아이템으로 팝업 메뉴를 다는 방법을 연습해보겠습니다.

📙 완성본

result

📙 과정

1.  RecyclerView에 Button을 만들어줍니다

저는 참고로 ImageButton으로 생성했습니다.

<ImageButton
                android:id="@+id/boardDetail_ibtn_more"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_marginEnd="20dp"
                android:background="@android:color/transparent"
                android:scaleType="centerInside"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:srcCompat="@drawable/morecion" />
2. 이제 MenuItem도 만들어줍니다

이 부분은 res > 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/menu_edit"
        android:title="수정"/>
    <item
        android:id="@+id/menu_delete"
        android:title="삭제"/>
    
</menu>
3. Adapter에 클릭이벤트를 연결합니다

지금 진행중인 프로젝트에 사용된 코드여서 필요 없는 부분은 안 보셔도 돼요!

more.setOnClickListener {
                val popup:PopupMenu = PopupMenu(context,more)
                MenuInflater(context).inflate(R.menu.board_menu_item, popup.menu)

                popup.show()
                popup.setOnMenuItemClickListener {
                    when(it.itemId){
                        R.id.menu_edit -> {

                            itemmodifyListener.onClick(bindingAdapterPosition)
                            return@setOnMenuItemClickListener true
                        }
                        R.id.menu_delete ->{
                            BoardService().deleteBoardDetail(boardList[position].id, DeleteCallback(position))
                            Log.d(TAG, "onBindViewHolder: ${boardList[position].id}")
                            return@setOnMenuItemClickListener true
                        }else->{
                        return@setOnMenuItemClickListener false
                    }
                    }
                }
            }
💡 꿀팁

val popup:PopupMenu = PopupMenu(context, more)에서 more이 저는 ImageButton입니다!
즉, 본인이 팝업메뉴를 띄우고 싶은 부분을 저 부분에 적어주셔야 그 위에 팝업 메뉴가 이쁘게 위치합니다.

PopupMenu( context , popupmenu를 띄울위치 )