본문 바로가기
프로그래밍/Android

[Android] Popup Menu

by Youngs_ 2023. 2. 20.

방법1

 

<ImageButton
    android:id="@+id/imageButton_Data"
    android:layout_width="50dp"
    android:layout_height="50dp"
    />

 

style.xml

    <style name="PopupMenuTheme" parent="Widget.AppCompat.PopupMenu">
        <item name="popupMenuStyle">@style/PopupMenu</item>
        <item name="android:itemTextAppearance">@style/itemTextStyle.AppTheme</item>
        <item name="android:listPreferredItemHeightSmall">75dp</item>
    </style>
    <style name="PopupMenu" parent="ThemeOverlay.AppCompat.Dark">
        <item name="android:popupBackground">@drawable/menu_style</item>
    </style>
    <style name="itemTextStyle.AppTheme" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@color/색</item>
        <item name="android:textSize">18sp</item>
    </style>

 

drawable\menu_style.xml

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle" >
            <corners android:bottomLeftRadius="15dp"
                android:topLeftRadius="15dp">
            </corners>
            <solid android:color="#39FFFFFF" />
        </shape>
    </item>
</layer-list>

 

binding.imageButtonData.setOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View) {
                    val wrapper: Context = ContextThemeWrapper(
                        this@현재액티비티명,
                        R.style.PopupMenuTheme
                    )
                    val popup = PopupMenu(wrapper, v)  //v는 클릭된 뷰를 의미
                    var setting = SpannableString("환경설정" + "   ").also {
                        it.setSpan(
                            AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE),
                            0,
                            it.length,
                            0
                        )
                    }
                    var exit = SpannableString("종료" + "   ").also {
                        it.setSpan(
                            AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE),
                            0,
                            it.length,
                            0
                        )

                    }
                    popup.menu.add(0, 0, 0, setting)
                    popup.menu.add(0, 1, 1, exit)



                    popup.setOnMenuItemClickListener { item ->

                        when (item.itemId) {
                            0 -> {
                                startActivity(
                                    Intent().setClassName(
                                        this@현재액티비티명,
                                        "com.패키지명.클래스명"
                                    )
                                )
                            }
                            1 -> {
                            	// TODO
                            }
                        }
                        false
                    }
                    popup.show()
                }
            })

 


방법2

버튼클릭으로 팝업메뉴 나타내기

버튼하나를 만들어서 클릭시 팝업메뉴를 간단하게 표시해보겠습니다. 그리고 팝업마다 클릭 이벤트를 주는 방법도 알아보겠습니다.

 

activity_main.xml

일단 사용하는 레이아웃에 버튼을 하나 만들어 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn"
        android:text="팝업메뉴"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

그리고 res 하위 폴더에 menu폴더를 만들어 줍니다.

popup.xml

 

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_menu1"
        android:title="메뉴 1" />
    <item
        android:id="@+id/action_menu2"
        android:title="메뉴 2" />
    <item
        android:id="@+id/action_menu3"
        android:title="메뉴 3" />

</menu>

이제 팝업메뉴 버튼클릭시 이벤트를 나타내게 한번 작성해보겠습니다.

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                final PopupMenu popupMenu = new PopupMenu(getApplicationContext(),view);
                getMenuInflater().inflate(R.menu.popup,popupMenu.getMenu());
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem menuItem) {
                        if (menuItem.getItemId() == R.id.action_menu1){
                            Toast.makeText(MainActivity.this, "메뉴 1 클릭", Toast.LENGTH_SHORT).show();
                        }else if (menuItem.getItemId() == R.id.action_menu2){
                            Toast.makeText(MainActivity.this, "메뉴 2 클릭", Toast.LENGTH_SHORT).show();
                        }else {
                            Toast.makeText(MainActivity.this, "메뉴 3 클릭", Toast.LENGTH_SHORT).show();
                        }

                        return false;
                    }
                });
                popupMenu.show();
            }
        });
    }

}

 


방법2 출처 : https://deumdroid.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%8C%9D%EC%97%85%EB%A9%94%EB%89%B4Popup-menu-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

안드로이드 팝업메뉴(Popup menu) 사용하기

계발에서 개발까지 버튼클릭으로 팝업메뉴 나타내기 버튼하나를 만들어서 클릭시 팝업메뉴를 간단하게 표시해보겠습니다. 그리고 팝업마다 클릭 이벤트를 주는 방법도 알아보겠습니다. activity

deumdroid.tistory.com

 

댓글