> Hello World !!!

     

@syaku

안드로이드 메뉴 #1 옵션 메뉴와 컨텍스트 메뉴 그리고 서브메뉴 : Android Menu #1 OptionMenu , ContextMenu And SubManenu

written by Seok Kyun. Choi. 최석균

 안드로이드 메뉴의 종류와 기능에 대해서 알아본다.

※ 버전 : Android SDK 2.3.1

안드로이드 메뉴의 종류와 기능에 대해서 알아보자. 안드로이드에서 제공하는 메뉴는 그다지 세련되지 않지만, 일반적으로 사용할때 무난하다고 생각된다. 메뉴에는 3가지 종류가 있다.

1. 옵션 메뉴 : 화면 아래쪽에 숨겨있으며 모바일기기 메뉴버튼을 누르면 위로 나타나게 된다. 최대 6개의 메뉴 항목을 가질수 있으며, 5개까지만 해당 메뉴가 노출되고 6개 이상인 경우 MORE 항목에 숨겨지게 된다. 메뉴 항목에는 아이콘으로 장식할 수 있지만, 체크박스나 라디오 그룹으로 구성할 수 없다. 

2. 컨텍스트 메뉴 : 모바일기기 화면을 일정시간 동안 누르고 있거나 홈 버튼을 누르고 있으면 화면 중앙에 나타나는 메뉴이다. 주로 리스트 뷰의 항목에 대해 사용한다. 아이콘으로 장식할 수 없지만, 체크박스나 라디오 그룹으로 구성할 수 있다.

3. 서브 메뉴 : 메뉴 항목을 가지는 일종의 팝업이며 화면 가운데에 나타난다.옵션 메뉴나 컨텍스트 메뉴에 더 많은 항목을 넣을 수 있는 역활을 한다. 단 서브 메뉴안에 서브 메뉴를 구성할 수 없다.



※ 메서드 설명 : 소스 이해를 돕기위해 설명이므로, 아래의 소스를 분석할때 참조하자.

> boolean onCreateOptionsMenu (Menu menu)
모바일기기의 Menu 를 선택하면 호출되는 메서드

> boolean onOptionsItemSelected (MenuItem item)
메뉴 항목이 선택되었을 때 호출되는 메서드

> MenuItem add (int groupId, int itemId, int order, CharSequence title)
> MenuItem add (int groupId, int itemId, int order, int titleRes)
하나의 메뉴 항목을 추가한다.
groupId : 여러 개의 메뉴 항목을 그룹으로 구성할 때 지정한다.
itemId : 메뉴 항목의 고유ID를 지정한다. 선택된 메뉴 항목이 무엇인지 알 수 있게된다.
order : 메뉴 항목의 순서를 지정한다.
titleRes , title : 메뉴 항목을 타이틀을 지정한다.

> SubMenu addSubMenu (int titleRes)
메뉴 항목 아래 서브 메뉴를 구성할때 사용한다.

> 메뉴 항목의 메서드 속성 설명 : xml 에서 사용할때는 set 을 지우고, 첫글자를 대문자로 속성을 지정하여 사용할 수 있다.
setIcon (int iconRes) : 아이콘 지정
setTitle (CharSequence) : 타이틀 지정
setVisible (boolean visible) : 노출여부 지정
setAlphabeticShortcut (char alphaChar) : 알파벳 단축키
setNumbericShortcut (char numericChar) : 숫자 단축키
setChecked (boolean checked) : 체크여부 지정
setEnabled (boolean enabled) : 잠금여부 지정

 커스텀 뷰 메뉴 만들기

> 1-1. 커스텀 뷰 만들기
package com.syaku;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class AndroidMenu extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 커스텀뷰 선언
        TextView view = new TextView(this);
        view.setText("메뉴를 입력하세요."); // 뷰에 텍스트를 출력한다.
        setContentView(view); // 뷰 반영
    }
    
}

> 1-2. 메뉴 만들기

커스텀 뷰에 아래의 메소드와 임포트를 넣어 주면 된다. 어플을 실행하고 menu 버튼(모바일기기)을 눌러야 메뉴가 활성화된다.
쇼컷(단축키)도 메뉴가 활성화된 후에 "a" 키를 누르면 작동한다.
    import android.view.*; // Menu 클래스를 임포트해야함.

    public boolean onCreateOptionsMenu(Menu menu) {
    	super.onCreateOptionsMenu(menu); // 부모 에도 매개변수 지정
    	// int group_id , int itemId , int order , CharSequence title or int titleRes
    	MenuItem item = menu.add(0, 1,0,"짜장"); // 짜장 메뉴항목 생성
    	item.setIcon(R.drawable.icon); // 아이콘 적용
    	item.setAlphabeticShortcut('a'); // 단축키 적용
    	
    	menu.add(0,2,0,"짬뽕").setIcon(R.drawable.icon); // 두번째 메뉴항목을 생성하고 아이코 적용
    	
    	SubMenu etc = menu.addSubMenu("기타"); // 세번째 기타 서브메뉴 생성
    	etc.add(0,3,0,"우동");
    	etc.add(0,4,0,"만두");    	
   	    	
    	return true;
   	    	
    }


> 2. 메뉴 항목에 기능 부여하기

메뉴의 마무리 작업이다. 각 메뉴를 선택하게 되면 토스트를 이용하여 알림메세지가 출력되도록 해보자.
package com.syaku;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*; // Toast 함께 임포트하기.
import android.view.*; // Menu 클래스를 임포트해야함.

public class AndroidMenu extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 커스텀뷰 선언
        TextView view = new TextView(this);
        view.setText("메뉴를 입력하세요."); // 뷰에 텍스트를 출력한다.
        setContentView(view); // 뷰 반영
    }
        
    public boolean onCreateOptionsMenu(Menu menu) {
    	super.onCreateOptionsMenu(menu); // 부모 에도 매개변수 지정
    	// int group_id , int itemId , int order , CharSequence title or int titleRes
    	MenuItem item = menu.add(0, 1,0,"짜장"); // 짜장 메뉴항목 생성
    	item.setIcon(R.drawable.icon); // 아이콘 적용
    	item.setAlphabeticShortcut('a'); // 단축키 적용
    	
    	menu.add(0,2,0,"짬뽕").setIcon(R.drawable.icon); // 두번째 메뉴항목을 생성하고 아이코 적용
    	
    	SubMenu etc = menu.addSubMenu("기타"); // 세번째 기타 서브메뉴 생성
    	etc.add(0,3,0,"우동");
    	etc.add(0,4,0,"만두");    	
   	    	
    	return true;
   	    	
    }
    
    public boolean onOptionsItemSelected(MenuItem item) {
    	switch (item.getItemId()) {
    	case 1:
    		Toast.makeText(this,"짜장면은 손짜장이 최고",Toast.LENGTH_SHORT).show();
    		return true;
    	case 2:
    		Toast.makeText(this,"짬뽕은 뽕의전설이 최고",Toast.LENGTH_SHORT).show();
    		return true;
    	case 3:
    		Toast.makeText(this,"우동 !!!!!!!!!!!! 너머거",Toast.LENGTH_SHORT).show();
    		return true;
    	case 4:
    		Toast.makeText(this,"만두는 서비스!!!",Toast.LENGTH_SHORT).show();
    		return true;    		
    	}
    	return false;
    }    
}


 리소스(XML)를 이용해 메뉴 만들기

리소스를 이용한 메뉴만들기는 이전에 했던 메뉴만들기에서 xml 리소스만 추가된 부분이라, 이전 예제소스를 이해했다면 쉽게 넘어갈 수 있는 부분이다.

> 리소스 만들기
메뉴의 리소스를 만들기 위해 res/menu/menu.xml 파일을 생성한다.
이클립스에서 xml 파일을 만들때에는 왼쪽 트리메뉴에서 menu 폴더를 생성하고 폴더 오른쪽 마우스를 클릭한다.
New > Other > Android : Andorid XML File 를 선택한다.
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:id="@+id/jjajang"
			android:title="짜장"
			android:icon="@drawable/icon"
			android:alphabeticShortcut="a"
			/>
			
	<item android:id="@+id/jjambbong"
			android:title="짬뽕"
			android:icon="@drawable/icon"			
			/>
			
	<item android:id="@+id/submenu"
			android:title="기타">
		<menu>
			<item android:id="@+id/udong"
					android:title="우동"
					/>
			<item android:id="@+id/mandoo"
					android:title="만두"
					/>
		</menu>
	</item>									
</menu>

> 리소스를 어플리케이션에 반영하기

package com.syaku;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*; // Toast 함께 임포트하기.
import android.view.*; // Menu 클래스를 임포트해야함.

public class AndroidMenu extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 커스텀뷰 선언
        TextView view = new TextView(this);
        view.setText("메뉴를 입력하세요."); // 뷰에 텍스트를 출력한다.
        setContentView(view); // 뷰 반영
    }
        
    public boolean onCreateOptionsMenu(Menu menu) {
    	super.onCreateOptionsMenu(menu); // 부모 에도 매개변수 지정
    	
    	MenuInflater inflater = getMenuInflater();
    	inflater.inflate(R.menu.menu, menu); // 리소스 메뉴 적용
 	   	    	
    	return true;
   	    	
    }
    
    public boolean onOptionsItemSelected(MenuItem item) {
    	switch (item.getItemId()) {
    	case R.id.jjajang: // 짜장 id 리소스인 경우
    		Toast.makeText(this,"짜장면은 손짜장이 최고",Toast.LENGTH_SHORT).show();
    		return true;
    	case R.id.jjambbong:
    		Toast.makeText(this,"짬뽕은 뽕의전설이 최고",Toast.LENGTH_SHORT).show();
    		return true;
    	case R.id.udong:
    		Toast.makeText(this,"우동 !!!!!!!!!!!! 너머거",Toast.LENGTH_SHORT).show();
    		return true;
    	case R.id.mandoo:
    		Toast.makeText(this,"만두는 서비스!!!",Toast.LENGTH_SHORT).show();
    		return true;    		
    	}
    	return false;
    }    
}


내용이 길어지는 관계로 #1은 여기서 마무리하고,
#2에서 좀 더 액티브한 기능을 가지 메뉴를 만들어보도록 하자.



> 메뉴를 선택하면 메뉴 항목이 아래에서 노출된다.



노출된 메뉴를 선택하면 알림 메세지가 출력된다. 기타를 누르게 되면 아래와 같은 서브 메뉴가 호출된다.




Syaku Blog by Seok Kyun. Choi. 최석균.
posted syaku blog


『  Links  

안드로이드프로그래밍정복.1(개정판)SDK2.3진저브레드를적용한안드?
카테고리 컴퓨터/IT > 대학교재
지은이 김상형 (한빛미디어, 2011년)
상세보기


http://syaku.tistory.com