반응형
Ex16ContextMenu
안드로이드 네이티브 앱 개발 수업 예제#16
주요코드
ContextMenu 추가하기 [뷰를 꾹~ 누르고 있으면(long click) 팝업되어 보여지는 메뉴 : 데스크탑에서의 마우스 오른쪽버튼 메뉴 역할]
- 메뉴을 추가하고 싶은 뷰(이 예제에서는 Button)을 ContextMunu로 등록(registerForContextMenu())
- ContextMenu를 만들기 위한 메소드 onCreateContextMenu() 오버라이드
- ContextMenu도 OptionMenu만드는 방식과 동일함
- XML언어로 메뉴항목들을 설계하고 자바언어의 MenuItem객체로 만들어서(부풀리다inflate) Menu에 추가하는 방법을 사용함.res폴더>>menu폴더 생성 [ res폴더에서 마우스오른쪽버튼 메뉴에서 'Android Resource Directory' 선택 후 위에서 2번째 항목의 'Resource Type'에서 'menu'선택하면 menu폴더 추가됨] menu폴더에 있는 context.xml문서를 읽어와서 Menu객체로 만들어주는(부풀려주는inflate) 객체인 MenuInflater사용
- ContextMenu의 Menu(MenuItem)클릭 반응하기
실행모습
실행모습 GIF
소스코드
버튼의 롱~클릭으로 나타날 컨텍스트 메뉴에 보여줄 메뉴의 항목들 Menu Resource로 설계
- res폴더>>menu폴더 생성 [ res폴더에서 마우스오른쪽버튼 메뉴에서 'Android Resource Directory' 선택 후 위에서 2번째 항목의 'Resource Type'에서 'menu'선택하면 menu폴더 추가됨
- 추가된 menu 폴더에서 마우스오른쪽버튼 메뉴에서 [ New > Menu Reource File ]선택하여 file name 칸에 "context"을 쓰고 [OK]를 누르면 메뉴리소스파일 이 만들어 짐.
# res / menu / context.xml |
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_save"
android:title="Save"/>
<item android:id="@+id/menu_delete"
android:title="Delete"/>
<!-- ContextMenu는 기본적으로 icon이 적용되지 않음 -->
</menu>
# 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:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="show Context Menu"
android:onClick="clickBtn"/>
</LinearLayout>
# MainActivity.java |
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn= findViewById(R.id.btn);
//액티비티에게 btn객체를 ContextMenu로 등록
registerForContextMenu(btn);
}
//ContextMenu로 등록된 뷰가 롱클릭되면
//컨텍스트메뉴를 만드는 메소드가 자동으로 실행되는 콜백메소드..
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
//OptionMenu와 만드는 방법은 동일함.
//res폴더>>menu폴더>>context.xml 파일을 만들어서 메뉴항목들 작성
//context.xml파일을 메뉴객체로 생성(부플리다..)
MenuInflater inflater= getMenuInflater();
inflater.inflate(R.menu.context, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
//콘텍스트메뉴의 아이템을 선택했을때 자동으로 실행되는 콜백메소드..
@Override
public boolean onContextItemSelected(MenuItem item) {
//context.xml파일에 작성한 메뉴항목들의 id를 식별하여 토스트 보여주기
switch ( item.getItemId() ){
case R.id.menu_save:
Toast.makeText(this, "SAVED", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_delete:
Toast.makeText(this, "DELETED", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
// 기본적인 버튼으로서의 클릭이벤트 동작 확인 콜백메소드...
public void clickBtn(View v){
Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
}
}
반응형