Android UI 메뉴 생성

프로그래밍/Android 2013. 8. 23. 11:22

Android UI 메뉴 생성



메뉴 종류


Option 메뉴

- 디바이스의 MENU 키를 누름면 하단에 표시되는 메뉴

- Icon Menu : 스크린 하단에 최초로 보여지는 아이템들의 모음. 최대 여섯 개의 메뉴 아이템을 지원한다.

- Expanded Menu : 아이콘 메뉴의 "More" 를 선택했을 때 보여지는 수직적 아이템 목록


Context 메뉴

- long-press 를 수행할 때 나타날 수 있는 스크린 상에 떠있게 되는 floating 메뉴 아이템 목록


서브메뉴

- Option 메뉴 또는 Context 메뉴의 하위로 보여지게 되는 서브메뉴



메뉴 생성


Option 메뉴

- Option 메뉴가 최초로 오픈될때 onCreateOptionsMenu() 메소드가 실행된다.

- 메뉴를 구성하기 위해서는 파라미터로 전달되는 Menu 오프젝에 메뉴를 추가하면 된다.

- XML 로 정의된 메뉴를 inflate 하거나 코드롤 메뉴를 추가하면 된다.


Option 메뉴 상의 메뉴가 선택될때 onOptionsItemSelected() 메소드가 실행된다.(Activity 콜백)

선택된 MenuItem 을 파라미터로 넘겨준다.

/* Create the menu items */
public boolean onCreateOptionsMenu( Menu menu){
	menu.add(0, MENU_NEW_GAME, 0, "New Game"); // groupId, itemId, order, title
	menu.add(0, MENU_QUIT, 0, "Quit");
	return true;
}

/* Handles item selections */
public boolean onOptionsItemSelected(MenuItem item){
	switch( item.getItemId()){
		case MENU_NEW_GAME:
			newGame();
			return true;
		case MENU_QUIT :
			quit();
			return true;
		}
		return false;
	}
}



아이콘 추가하기

menu.add(0, MENU_QUIT, 0, "Quit").setIcon( R.drawable.menu_quit_icon);


메뉴 수정하기

- 메뉴가 오픈될때마다 onPrepareOptionsMenu( Menu menu) 메소드가 실행된다.

- 해당 메소드를 오버라이드해서 메뉴를 적절하게 수정할 수 있다.

- 애플리케이션, 게임의 상태에 따라 아이콘을 변경한다든지, 메뉴를 추가한다던지 할때 유용하다.


Context 메뉴

- Activity의 Context 메뉴 콜백 onCreateContextMenu(), onContextItemSelected() 을 통해 Context 메뉴를 생성한다.

- 생성된 Context 메뉴는 registerForContextMenu()를 사용해서 뷰View 에 대한  ContextMenu 를 등록한다.


// ContextMenuInfo 는 선택된 뷰와 선택된 오브젝트에 대한 추가적인 정보를 제공한다.
public void onCreateContextMenu( ContextMenu menu, View v, ContextMenuInfo menuInfo){
	super.onCreateContextMenu(menu, v, menuInfo);
	menu.add(0, EDIT_ID, 0, "Edit");
	menu.add(0, DELETE_ID, 0, "Delete");
}

public boolean onContextItemSelected( MenuItem item){
	AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
	switch(item.getItemId()){
		case EDIT_ID : 
			editNote(info.id); return true;
		case DELETE_ID :
			deleteNote(info.id); return true;
		default :
			return super.onContextItemSelected(item);
		}
	}
}


// 리스트뷰에 있는 모든 아이템에 Context 메뉴를 등록한다.

registerForContextMenu( getListView());


서브메뉴 

- 서브메뉴는 또 다른 서브 메뉴를 제외한 어떤 메뉴에든 추가될 수 있다.

public boolean onCreateOptionsMenu(Menu menu){
	boolean result = super.onCreateOptionsMenu( menu);
	
	SubMenu fileMenu = menu.addSubMenu("File");
	SubMenu editMenu = menu.addSubMenu("Edit");
	fileMenu.add("new");
	fileMenu.add("open");
	fileMenu.add("save");
	editMenu.add("undo");
	editMenu.add("redo");
	return result;
}


XML로 메뉴 정의하기

- 세개의 유효한 엘리멘트 <menu>, <group>, <item>

// XML 파일 (options_menu.xml . res/menu/ 폴더에 위치)

	
	

// JAVA 코드
public boolean onCreateOptionsMenu(Menu menu){
	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.options_menu, menu);
	return true;
}


메뉴 특성


메뉴 그룹

- 메뉴의 특성을 공유하는 메뉴 아이템들의 집합

- setGroupVisible(), setGroupEnabled(), setGroupCheckable()


체크가능한 메뉴 아이템

menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate").setCheckable(true);

// IN onOptionsItemSelected()
switch( item.getItemId()){
	case VIBRATE_SETTING_ID :
		if( item.isChecked()) item.setChecked(false);
		else item.setChecked(true);
		return true;
}

// Group Checkable
SubMenu subMenu = menu.addSubMenu("Color");
subMenu.add(COLOR_MENU_GROUP, COLOR_RED_ID, 0, "Red");
subMenu.add(COLOR_MENU_GROUP, COLOR_BLUE_ID, 0, "Blue");
subMenu.setGroupCheckable( COLOR_MENU_GROUP, true, true); // groupId, checkable, true => radio button | false => checkbox

Shortcut 키

menu.add(0, MENU_QUIT, 0, "Quit").setAlphabeticShortcut("q");


메뉴 아이템 인텐트


단일 메뉴 아이템에 인텐트 설정하기

- 새로운 액티비티를 실행하는 메뉴 

// IN onCreateOptionsMenu() 
MenuItem menuItem = menu.add(0, PHOTO_PICKER, 0, "Select Photo");
menuItem.setIntent( new Intent(this, PhotoPicker.class));


- 동적으로 인텐트 추가하기

public boolean onCreateOptionsMenu( Menu menu){
	super.onCreateOptionsMenu( menu);
	// Create an Intent that describes the requirements to fulfill,
	// to be included
	// in our menu.
	// The offering app must include a category value
	// of Intent.CATEGORY_ALTERNATIVE
	Intent intent = new Intent(null, getIntent().getData());
	intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
	
	menu.addIntentOptions( 
		thisClass.INTENT_OPTIONS, // Menu group
		0, 										// Unique item ID(none)
		0, 										// Order for the items(none)
		this.getComponentName(), 	// The current Activity name
		null, 									//Specific items to place first (noen)
		0, 										// Additional flags to control items (none)
		null); 									//Array of MenuItems that corrolate to specific items (none)
}


: