본문 바로가기
안드로이드 자바

[Android][Java] 팝업메뉴

by teamnova 2024. 1. 3.
728x90

팝업메뉴와 옵션메뉴는 안드로이드 공식문서에서 다르게 정의하고 있습니다. 

https://developer.android.com/guide/topics/ui/menus?hl=ko#xml

 

 

 

잘 와닿지는 않지만, 제가 이해한 내용은 네이버 화면을 예시로 들자면

오른쪽에 위치한 세 개의 수직 점을 눌렀을때 나오는 메뉴가 옵션메뉴 

가로 세 개의 점선을 눌렀을때 나오는메뉴가 팝업메뉴라고 이해하고 있습니다.  

 

 

 

 

res 하위 폴더에 menu폴더를 만들고 popup.xml 을 만듭니다. 

 

 

popup.xml 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu1"
        android:title="menu1"/>

    <item android:id="@+id/menu2"
        android:title="menu2"/>

    <item android:id="@+id/menu3"
        android:title="menu3"/>

</menu>

 

 

MainActivity

public class MainActivity extends AppCompatActivity {

    ImageView option;

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


        option = findViewById(R.id.option);


        option.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //PopupMenu 객체 생성
                PopupMenu popup= new PopupMenu(MainActivity.this, view); //두 번째 파라미터가 팝업메뉴가 붙을 뷰
                getMenuInflater().inflate(R.menu.popup, popup.getMenu());

                //팝업메뉴의 메뉴아이템을 선택하는 것을 듣는 리스너 객체 생성 및 설정
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem menuItem) {

                        int itemId = menuItem.getItemId();
                        if (itemId == R.id.menu1) {
                           //  원하는 동작코드를 작성하세요. 
                        } else if (itemId == R.id.menu2) {
                           // 
                        } else if (itemId == R.id.menu3) {
                           // 
                        }

                        return false;
                    }
                });



                popup.show();

            }
        });


    }

}

 

  • PopupMenu popup = new PopupMenu(MainActivity.this, view); 이 부분에서 PopupMenu 객체를 생성합니다. 첫 번째 매개변수는 현재 액티비티(MainActivity)를 나타내고, 두 번째 매개변수는 팝업 메뉴가 표시될 뷰를 지정합니다.
  • getMenuInflater().inflate(R.menu.popup, popup.getMenu()); 이 코드는 popup 메뉴를 R.menu.popup 리소스로부터 인플레이트(즉, 메뉴 아이템을 로드)합니다.
  • int itemId = menuItem.getItemId();는 사용자가 선택한 메뉴 아이템의 ID를 가져옵니다.
  • if-else 구문을 사용하여 각 메뉴 아이템 ID(R.id.menu1, R.id.menu2, R.id.menu3)에 따라 다른 동작을 수행합니다. 현재는 이 부분이 비어있어서 각 메뉴 아이템이 선택될 때 수행할 구체적인 동작을 추가해야 합니다.

 

 

activity.main.xml 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/option"
        android:layout_width="50dp"
        android:layout_height="50dp"

        android:src="@drawable/baseline_more_horiz_24"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

 

이미지는 drawable -> New -> Vector Asset -> Clip Art -> more horiz을 사용했습니다. 

 

 

 

실행결과 

 

 

 

 

 

 

참고로 switch-case 문으로 if-else를 대체하신다고하면 에러가 날 가능성이 있습니다. 

case 문에는 상수 (즉 final로 설정된 값)이 들어와야 하기 때문입니다. 

저희는 R파일에 접근해서 id값을 가져오는 것이기 때문에 이 값은 final (상수)가 아닙니다.