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 (상수)가 아닙니다.
'안드로이드 자바' 카테고리의 다른 글
[Android][Java] 앱 아이콘, 앱 이름 변경하기 (0) | 2024.01.12 |
---|---|
[Android][Java] Camera2 API를 사용하여 카메라 미리보기 생성하기 (0) | 2024.01.10 |
[Android][Java] 새 액티비티에서 응답받기 Intent, startActivityForResult (2) | 2023.12.25 |
[Android][Java] SQLite Database 데이터베이스 툴 사용하기 (0) | 2023.12.16 |
[JAVA][Android] 사람 이미지 배경 가리기 PorterDuff.Mode (0) | 2023.12.13 |