반응형
Ex17PopupMenu
안드로이드 네이티브 앱 개발 수업 예제#17
주요코드
PopupMenu 추가하기 [이전 컨텍스트메뉴와 다르게 원하는 위치에서 메뉴가 보이게 하고 싶을때 사용하는 메뉴]
- 컨텍스트메뉴처럼 버튼을 롱~클릭했을때 버튼에 메뉴 보이기
- OptionMenu나 Context메뉴처럼 액티비티에 create하는 메소드가 존재하지 않음.
- 메뉴객체가 놓여지길 원하는 위치에 PopupMenu객체 생성하여 붙이고(anchor view 설정) 그 PopupMenu객체안에 있는 Menu객체에 MenuItem을 추가하여 보이도록 함.
- 다른 메뉴들과 마찬가지로 XML언어로 메뉴항목들을 설계하고 자바언어의 MenuItem객체로 만들어서(부풀리다inflate) Menu에 추가하는 방법을 사용함.res폴더>>menu폴더 생성 [ res폴더에서 마우스오른쪽버튼 메뉴에서 'Android Resource Directory' 선택 후 위에서 2번째 항목의 'Resource Type'에서 'menu'선택하면 menu폴더 추가됨] menu폴더에 있는 popup.xml문서를 읽어와서 Menu객체로 만들어주는(부풀려주는inflate) 객체인 MenuInflater사용
- PopupMenu의 Menu(MenuItem)클릭 반응하기
- 버튼을 롱~클릭했을때 다른 버튼에 팝업메뉴가 붙어서 보이도록 지정하기
실행모습
실행모습 GIF
소스코드
버튼의 롱~클릭으로 나타날 팝업 메뉴에 보여줄 메뉴의 항목들 Menu Resource로 설계
- res폴더>>menu폴더 생성 [ res폴더에서 마우스오른쪽버튼 메뉴에서 'Android Resource Directory' 선택 후 위에서 2번째 항목의 'Resource Type'에서 'menu'선택하면 menu폴더 추가됨
- 추가된 menu 폴더에서 마우스오른쪽버튼 메뉴에서 [ New > Menu Reource File ]선택하여 file name 칸에 "popup"을 쓰고 [OK]를 누르면 메뉴리소스파일 이 만들어 짐.
# res / menu / popup.xml |
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_info"
android:title="information"/>
<item android:id="@+id/menu_delete"
android:title="delete"/>
<item android:id="@+id/menu_modify"
android:title="modify"/>
</menu>
# activity_main.xml |
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:padding="16dp"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button"
android:onClick="clickBtn"/>
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="button2"/>
</RelativeLayout>
# MainActivity.java |
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button btn;
Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn= findViewById(R.id.btn);
btn2= findViewById(R.id.btn2);
//버튼이 롱클릭되는 것을 듣는 리스너 생성 및 설정
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
//PopupMenu 객체 생성
PopupMenu popup= new PopupMenu(MainActivity.this, view); //두 번째 파라미터가 팝업메뉴가 붙을 뷰
//PopupMenu popup= new PopupMenu(MainActivity.this, btn2); //첫번째 버튼을 눌렀지만 팝업메뉴는 btn2에 붙어서 나타남
getMenuInflater().inflate(R.menu.popup, popup.getMenu());
//팝업메뉴의 메뉴아이템을 선택하는 것을 듣는 리스너 객체 생성 및 설정
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.menu_info:
Toast.makeText(MainActivity.this, "INFORMATION", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_delete:
Toast.makeText(MainActivity.this, "DELETE", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_modify:
Toast.makeText(MainActivity.this, "MODIFY", Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});
popup.show();
return true;
}
});
}
public void clickBtn(View v){
Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
}
public void clickBtn2(View view) {
}
}
반응형