티스토리 뷰

프로그램/안드로이드 강좌

Context 메뉴

서.라.연 2012. 8. 15. 13:03


이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
안드로이드용 어플리케이션 중에서 통화 목록을 관리하는 것이나 메신저 같은 어플리케이션을 보면
리스트뷰로 이루어진 경우가 많고, 리스트뷰의 한 항목을 2 ~ 3 초간 터치하고 있으면 해당 항목에
대해서 수행할 수 있는 작업(삭제, 수정, 저장, 대화하기 등)이 띄워지는 것을 볼 수 있습니다.
이렇게 특정 뷰에서 할수 있는 작업을 메뉴로 구성한 것을 Context Menu 라고 합니다. 이번 강좌에서는
Context Menu 를 사용하는 방법에 대해서 구체적으로 알아보도록 하겠습니다.
Context Menu 에 대해 알아보기 전에 메뉴의 종류와 기본적인 XML 키워드에 대해 알고싶으신 분은
아래에 링크된 자료를 참고하여 주시기 바랍니다.
Options Menu 와 Sub Menu 에 대하여 알고싶으신 분은 아래에 링크된 자료를 참고하시면 됩니다.
메뉴( Menu ) - Options Menu : http://www.tipssoft.com/bulletin/tb.php/FAQ/984
1. XML 로 리소스 구성하기
메뉴를 XML 로 구성할 때에는 res 폴더에 menu 폴더를 생성한 후 메뉴를 구성할 XML 파일을 생성해
주어야 합니다. XML 파일 내부에는 아래와 같이 자신이 사용할 항목을 정의해주면 됩니다. 이 코드는
"Hi", "Hello", "Good" 항목으로 이루어진 메뉴를 구성합니다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/id_menu_hi"
android:title="Hi"
/>
<item
android:id="@+id/id_menu_hello"
android:title="Hello"
/>
<item
android:id="@+id/id_menu_good"
android:title="Good"
/>
</menu>
2. 소스 코드로 기능 구현하기
XML 형식으로 구성한 메뉴를 어플리케이션에서 띄우고 메뉴의 각 항목에 자신이 원하는 작업을
설정하기위해서는 아래와 같은 작업들을 수행해주어야 합니다.
2.1 뷰 등록하기
Context Menu 는 특정 뷰에서 발생하는 것이기때문에 메뉴가 사용되기를 원하는 뷰를
등록시켜주어야 합니다. 텍스트뷰나 이미지뷰 같은 단순한 뷰뿐만 아니라 여러개의 뷰들로
구성되는 ListView 도 등록할 수 있습니다.
등록할 때 사용하는 메소드는 Activity 클래스의 registerForContextMenu 메소드이며 아래의
코드처럼 액티비티가 생성될 때 호출해주는 것이 좋습니다.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// 리소스 파일에 정의된 id_list 라는 ID 의 리스트뷰를 얻는다.
ListView list = (ListView) findViewById(R.id.id_list);
// 리스트뷰를 Context Menu 를 사용하는 뷰로 등록한다.
registerForContextMenu(list);
... 생략 ...
}
2.2 메뉴 등록하기
Context Menu 를 사용하는 뷰에서 사용자 조작에 의해 메뉴가 출력되어야 할 때 시스템에 의해
onCreateContextMenu 콜백 메소드가 호출됩니다. 이 때 XML 형식으로 구성된 메뉴를 시스템이
사용 가능한 Context Menu 로 재구성해주어야 합니다.
아래의 코드처럼 onCreateContextMenu 메소드에서는 메뉴를 재구성할 수 있도록 하는
MenuInflater 객체를 얻어서 사용자가 정의한 XML 메뉴가 시스템에서도 사용될 수 있도록
재구성하는 작업을 합니다.
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

// 액티비티에서 XML 형식으로 구성된 메뉴를 실제 사용 가능한 Context Menu 로
// 재구성하게 해주는 MenuInflater 객체를 얻는다.
MenuInflater inflater = getMenuInflater();
// XML 형식으로 구성된 메뉴를 사용 가능한 Context Menu 로 재구성한다.
inflater.inflate(R.menu.list_menu, menu);
}
2.3 사용자 조작 처리하기
Context Menu 에서 특정 항목이 선택되면 시스템은 onContextItemSelected 콜백 메소드를
호출합니다. 그렇기 때문에 메뉴가 선택되었을 때 프로그래머가 원하는 일을 정의하려면 해당
콜백 메소드를 재정의 해야합니다. 해당 메소드의 매개 변수인 MenuItem 는 선택한 항목 정보에
접근할 수 있는 인터페이스로 해당 객체를 이용해서 항목의 여러가지 정보를 얻을 수 있습니다.
아래의 코드는 메뉴에서 선택한 항목명을 텍스트뷰에 출력하도록 재정의한 것입니다.
@Override
public boolean onContextItemSelected(MenuItem item) {
// 텍스트뷰를 얻는다.
TextView tv = (TextView) findViewById(R.id.id_tv);

// 선택된 항목의 ID 를 얻는다.
switch (item.getItemId()) {
// 선택된 항목에 맞는 문자열을 텍스트뷰에 출력한다.
case R.id.id_menu_hi:
tv.setText("Menu select : Hi");
// 메뉴의 선택 처리가 완료되면 true 를 반환한다.
return true;
case R.id.id_menu_hello:
tv.setText("Menu select : Hello");
return true;
case R.id.id_menu_good:
tv.setText("Menu select : Good");
return true;
default:
// 사용자가 선택에 대한 처리를 완료하지 못하면 false 를 반환해도 되지만
// 바로 false 를 반환하지 않고, 슈퍼 클래스의 onContextItemSelected 메소드를
// 하여 해당 메소드가 반환하는 반환값을 반환해주는 것이 좋습니다.
return super.onContextItemSelected(item);
}
}
만약 위의 코드보다 조금 더 복잡한 기능을 구현하기 위해서 사용자가 리스트뷰의 몇번째 항목을
선택해서 메뉴를 발생시켰는가를 알고 싶다면 아래와 같이 AdapterContextMenuInfo 객체를
얻어서 사용하시면 됩니다.
// 선택된 리스트뷰의 항목에 대한 정보를 가진 AdapterContextMenuInfo 객체를 얻는다.
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
info.id 멤버 변수로 선택한 리스트뷰 항목의 id 를 얻을 수 있고, info.position 으로 항목의
위치정보를 얻을 수 있습니다.
3. 실행 화면
Context Menu 는 아래의 이미지처럼 리스트뷰의 항목을 길게 터치하여 사용하는 경우가 많습니다.
먼저 리스트뷰에서 하나의 항목을 길게 터치합니다. 하단의 중앙 이미지처럼 처음 항목을 터치하면
항목이 주황색으로 표시되다가 우측 이미지처럼 메뉴가 생성되면서 배경색이 다시 검정색으로
변합니다.
이 어플리케이션은 이 글의 2.3 번에서 구성한 onContextItemSelected 메소드를 적용하였기 때문에
메뉴에서 항목을 선택하면 아래의 그림과 같이 해당 항목에 맞는 문자열이 텍스트뷰에 출력됩니다.


'프로그램 > 안드로이드 강좌' 카테고리의 다른 글

메뉴 서브 메뉴  (0) 2012.08.15
메뉴 옵션 메뉴  (0) 2012.08.15
메뉴기초  (0) 2012.08.15
터치를 이용한 간단한 게임  (0) 2012.08.15
뷰의 터치위치 좌표로 출력하는 예제  (0) 2012.08.15
댓글