본문 바로가기

프로그래밍/안드로이드

[안드로이드] 메뉴(Menu)

※ 저는 안드로이드 프로그래밍 정복(김상형 著, 한빛미디어) 책을 이용해 공부하고 있으며

예제와 코드는 이 책을 통해 공부중임을 밝힙니다.

개인적인 공부를 하면서 정리한 형식이기 때문에 심각한 오류가 있을 수 있습니다. 피드백 주시면 정말 감사하겠습니다.


※ 안드로이드 프로그래밍 정복(371p~405p) 참조


안드로이드가 지원하는 메뉴


[1] 옵션 메뉴 : 액티비티의 주 메뉴. 화면 아래쪽에 숨겨져 있으며, MENU 버튼을 눌러야 나타난다.

[2] 컨텍스트 메뉴 : 화면을 길게 누르고 있으면 화면 중앙에 나타난다.

[3] 서브 메뉴 : 메뉴 항목을 가지는 일종의 팝업.


1.1 옵션메뉴


boolean onCreateOptionsMenu (Menu menu) // 콜백 메서드


onCreateOptionMenu 메서드는 최초 메뉴가 만들어질 때 딱 한 번만 호출되며 메뉴가 완성되면 다시 호출

되지 않는다. 메뉴는 정적인 명령 집합이어서 한 번만 초기화되며 이 메서드에서 만든 메뉴를 계속 사용하는

것이 보통이다. 만약 실행 중에 메뉴를 수정, 편집하려면 다음 메서드를 재정의 한다.


이 메서드는 사용자가 MENU 버튼을 누를 때 호출된다.

인수로 전달되는 menu 객체는 항목을 가지지 않는 빈 메뉴이다.

이 빈 메뉴에 항목과 그룹 등을 추가해 원하는 메뉴를 디자인한다.


항목을 추가하는 메서드와 서브 메뉴를 추가하는 메서드는 다음과 같다.


MenuItem add (int groupId, int itemId, int order, CharSequence title)

MenuItem add (int groupId, int itemId, int order, int titleRes)

SubMenu addSubMenu (int titleRes);    // 항목이 아주 많을 때 별도의 서브 메뉴 추가


groupId : 항목의 그룹을 구성할 때 지정. 그룹 소속이 아니라 단독 항목일때는 NONE(0)으로 준다.

itemId : 항목의 고유한 ID이며, 항목 선택 시 ID로 어떤 항목을 선택했는지 알아낸다.

order : 메뉴의 순서를 지정, NONE(0)이면 추가된 순서대로 나타난다.

title, titleRes : 메뉴 항목의 캡션 문자열이며 문자열 상수 또는 리소스 문자열 ID를 준다.


SubMenu는 Menu를 상속받으므로 add메서드를 호출할 수 있다. 

add메서드는 항목을 추가하고 새로 추가된 항목인 MenuItem 객체를 리턴한다.

일단 항목을 추가한 후 MenuItem 클래스의 다음 메서드로 항목의 상세 속성을 지정한다.


MenuItem setIcon (int iconRes)  // 메뉴항목과 같이 출력되는 작은 이미지

MenuItem setTitle (CharSequence title)

MenuItem setVisible (boolean visible)

MenuItem setAlphabeticShortcut (char alphaChar)  // 잘 사용하지 않음(키보드 환경)

MenuItem setNumericShortcut (char numericChar)  // 잘 사용하지 않음(키보드 환경)

MenuItem setChecked (boolean checked)

MenuItem setEnabled (boolean enabled)


상기 메서드는 항목의 소겅을 변경 후 항목 자체를 다시 리턴하므로

리턴되는 객체를 별도의 변수에 대입할 필요 없이 다른 메서드를 연속적으로 호출할 수 있다.

Menu의 add 메서드와 마찬가지로 MenuItem객체를 리턴하므로 추가 후 연쇄적으로 속성을 조정한다.


예를 들면, menu.add().setIcon().setTitle().setChecked();




boolean onPrepareOptionsMenu (Menu menu)


이 메서드는 메뉴가 열릴 때마다 호출되며 메뉴 항목을 추가하거나 뺄 수 있고 

체크 상태나 사용 금지 등 메뉴 항목의 속성을 변경할 수도 있다.

메뉴가 처음 만든 형태 그대로 사용되고 별도의 속성을 조정할 필요가 없다면

굳이 재정의하지 않아도 상관 없다 


메뉴항목이 선택될 때는 다음 메서드가 호출된다.


boolean onOptionsItemSelected (MenuItem item)


인수로 전달되는 item 객체는 사용자가 선택한 메뉴 항목이다.


public class Exercise extends Activity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView MyText = new TextView(this);
MyText.setText("메뉴 키를 누르세요.");
setContentView(MyText);
}

public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);

MenuItem item=menu.add(0,1,0,"짜장");
item.setIcon(R.drawable.ic_launcher);

menu.add(0,2,0, "짬뽕")

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;
}
}


나는 MENU 버튼이 나타나지 않는다. 왜 그럴까


1.2 XML로 메뉴 정의하기


메뉴 항목이 많을 경우 코드로 일일이 속성을 설정하는 것보다 XML로 작성하는 것이 좋다.



res 폴더 내에 menu가 없다면 만들어준다. 



이후 menu 노드를 오른쪽 클릭한 뒤 New/File 항목을 선택.

책에서는 optionmenu라고 이름지었다.



그러면 <menu> </menu>형식의 xml파일이 생긴다.



이렇게 menu.xml을 구성해주고



메뉴 전개자(MenuInflater)를 통해서 객체를 구한뒤 이 객체의 infalte 메서드를 호출하여

리소스의 메뉴를 실제 메뉴로 전개한다.


MenuInflater Activity.getMenuInflater()  // 메뉴 전개자 → inflate 메서드 호출

void inflate (int menuRes, Menu menu) // 첫 번쨰 인수 : 메뉴의 리소스 ID 전달

   두 번쨰 인수 : 전개된 메뉴를 담을 메뉴 객체 전달



우리는 레이아웃 전개에서 인플레이터(Inflater)에 대해서 배웠다.

(※ 전개(inflation) : 레이아웃의 정보대로 객체를 생성하고 속성 변경 메서드를 순서대로 호출하는 것)

메뉴 전개자는 XML의 item 엘리먼트(element)를 읽어 메뉴 항목을 추가하고 속성을 설정한다.

 


1.3 컨텍스트 메뉴



컨텍스트 메뉴는 특정 뷰나 항목에 필요한 명령만 모아 놓은 지역적인 메뉴이다. 모바일에서는 "롱 클릭"을 하면 튀어나온다.


void Activity.registerForContextMenu (View view)


컨텍스트 메뉴를 달고 싶은 뷰는 위 메서드로 등록한다. 보통 액티비티의 onCreate 메서드에서 등록한다.


void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfomenuInfo)


여러 개의 뷰를 등록해 놓을 수 있으므로 롱 클릭이 발생한 뷰 객체가 두 번째 인수(View v)로 전달된다.

menuinfo 인수는 표시해야 할 메뉴에 대한 세부 정보인데 뷰에 따라 제공되는 정보가 달라진다.


컨텍스트 메뉴의 항목을 선택하면 다음 콜백 메서드가 호출된다.


boolean onContextItemSelected (MenuItem item)


item 인수로 선택한 항목이 전달되며 이 항목에 대응되는 동작을 수행한다.


void onCreateContextMenu (ContextMenu menu)


뷰의 컨텍스트 메뉴를 생성할 때는 다음 메서드가 호출된다.

이름은 같지만 특정 뷰에 대해 호출되는 것이므로 뷰 인수가 없다

자신의 메뉴를 스스로 정의한다는 면에서 캡슐화에 유리하지만, 이 메서드를 재정의하려면

커스텀 위젯을 상속받아야 해서 번거롭다.



<컨텍스트 메뉴 예제>


레이아웃에는 세 개의 위젯이 배치되어 있다. 하단에 MyImage는 ImageView의 서브클래스이며 소스에서 별도로 정의한 커스텀 위젯이다. 해당 프로젝트의 패키지 경로를 적어야 한다.


자바 코드는 4개의 public 메서드로 구성된다.


onCreate 메서드에서 세 개의 위젯에 대한 컨텍스트 메뉴를 사용한다는 것을 "등록"했다.

void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfomenuInfo)



void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfomenuInfo)


사용자가 위젯을 "롱 클릭"하면 onCreateContextMenu 메서드가 호출되며

두 번째 인수로 롱 클릭한 뷰가 "전달"된다.

이 메서드는 컨텍스트 메뉴를 요청한 뷰가 누구인가에 따라 필요한 명령을 menu에 추가한다.




boolean onContextItemSelected (MenuItem item)


액티비티의 onContextItemSelected 메서드에서 동작을 일괄 처리한다.

메뉴 처리 메서드가 하나뿐이므로 한 액티비에 속한 모든 메뉴 항목의 ID는 고유해야 한다.






void onCreateContextMenu (ContextMenu menu)


커스텀 뷰는 onCreateContextMenu를 재정의하여 컨텍스트 메뉴를 직접 "생성"한다.

MyImage는 자신의 메서드에서 이미지 회전, 크기 변경 등 이미지 관리에 필요한 메뉴 항목을 추가한다.

컨텍스트 메뉴는 직접 생성하더라도 선택 시의 동작은 직접 처리할 수 없으며 

액티비티의 onContextItemSelected 메서드에서 일괄적으로 처리한다. (다시 위로 올라가보자)




최종 결과로 이런 예제를 얻을 수 있다.

Button과 EditText를 "롱 클릭"해야 메뉴버튼이 뜬다.

따라서 가끔 사용되는 명령을 숨겨두는 용도로 적합하다.


컨텍스트 메뉴는 호출 방법이 고정되어 있고 열리는 위치도 항상 중앙이라 실용성이 떨어진다.

요즘은 컨텍스트 메뉴보다 팝업 메뉴나 액션바에서 연구할 액션 모드가 더 권장된다.



1.4 PopupMenu


 

컨텍스트 메뉴 

팝업 메뉴 

비고 

호출 시점 

길게 누를 때  

원하는 때에 

여는 속도가 신속 

열리는 위치 

화면 중앙 

앵커 뷰 근처 

이동 거리를 최소화한다. 

열렸을 때 배경화면 

흐려진다.  

변화가 없다.  

작업 대상을 명확히 볼 수 있다. 


컨텍스트 메뉴의 단점을 해결한 팝업 메뉴이다. 

컨텍스트 메뉴는 시스템이 지원하는 기능인데 팝업 메뉴는 일종의 위젯이다.

따라서 원하는 때에 원하는 위치에 열 수 있다는 면에서 자유도가 높다. 



PopupMenu (Context context, View anchor)


먼저 생성자로 PopupMenu 객체를 생성한다.

VIew anchor : 팝업 메뉴를 표시할 앵커 뷰 지정

이 생성자는 빈 팝업 메뉴를 리턴하는데 여기다 항목을 채워 넣는다.

( 생성자로 생성된 객체를 반환)


Menu getMenu()

MenuInflater getMenuInflater()


메뉴와 메뉴 전개자는위 메서드로 구한다.

Menu의 add메서드로 빈 메뉴에 항목을 추가할 수도 있고

XML 문서로 작성하고 전개자의 infalte 메서드를 호출하여 메뉴를 만들 수도 있다.


void show()

void dismiss()


메뉴를 보이거나 숨길 수 있는 메서드이다.


void setOnMenuItemClickListener (PopupMenu.OnMenuItemClickListener listener)

void setOnDismissListener (PopupMenu.OnDismissListener listener)


메뉴 항목을 선택하거나 사라질 때의 이벤트를 처리하려면 위 두 메서드로 이벤트 리스너를 등록한다.

메뉴를 표시하기 전에 선택 이벤트 핸들러부터 등록해야 한다.


boolean onMenuItem Click (MenuItem item)


팝업 메뉴의 항목을 선택하면 리스너의 다음 메서드가 호출된다. 

인수로 전달되는 메뉴 항목별로 동작을 처리한다.



<팝업 메뉴 예제>


레이아웃에 버튼을 하나 배치



id 속성 값을 주고



4.0부터 이 세줄의 코드를 다음 호출 하나로 통합할 수 있게 간소화되었다.


popup.infalte(R.menu.popupmenutestmenu);


PopupMenu의 infalte 메서드로 메뉴 리소스의 ID만 전달하면 

이 리소스를 전개하여 자신의 빈 메뉴에 채워넣는다.

(단, 리소스에서 전개할 때만 사용하며 코드로 메뉴항목 구성시는 위 방법을 써야 함)



팝업 메뉴의 클릭 이벤트 핸들러를 등록한다.

이 버튼 하나에 대해서만 사용되므로 임시 객체로 리스너를 생성하여 등록했다.



반응속도가 진짜 빠르다.



2.1 메뉴편집


메뉴는 보통 디자인 타임에 XML로 작성하고 처음 호출시에 생성하여 계속 사용한다..

필요하다면 실행 중에도 메뉴를 편집할 수 있다. 메뉴를 열때마다 onPrepareOptionsMenu 메서드가

호출되며 여기서 메뉴를 원하는 대로 편집한다.


void removeItem(int id)

void clear()

MenuItem findItem(int id)

MenuItem getItem(int index)


단, 이 기능은 컨텍스트 메뉴와 서브 메뉴에만 사용할 수 있으며, 옵션메뉴에서는 사용할 수 없다.


<예제>



XL 파일에 메뉴를 다음과 같이 디자인한다.

@+id/bigfont는 체크 박스로 동작해야 하므로 all 그룹에 속해 있고

색상을 선택하는 @+id/exclusive_checkable_gorup은 single 그룹에 속해있다.


실행중에 항목의 체크 상태를 조사 및 변경할 때는 다음 메서드를 호출한다.


boolean isChecked()

MenuItem setChecked(boolean checked)







에뮬레이터로 실행시 하단 메뉴 버튼을 누르면 다음과 같은 실행 예제를 얻을 수 있다.

빨간 박스는 "all"에 해당하는 체크박스

파란 박스는 "single", 배타적으로 선택할 수 있는 것이다.



메뉴버튼이 없는 갤럭시 노트 5에서는 어떻게 실행을 해야 할지 모르겠다.


2.2 메뉴교체


상황에 따라 필요한 메뉴가 완전히 다르면 메뉴 전체를 통째로 바꿀 수도 있다.


void invalidateOptionsMenu()


이 메서드는 메뉴 전체를 무효화하여 다음번 메뉴를 열 때 onCreateOptionsMenu가 다시 호출된다.


레이아웃 2개의 버튼을 배치하고 각 버튼을 누를 때 mBeginner 변수의 값을 변경하고

invalidateOptionsMenu를 호출하여 메뉴를 무효화한다.

뭏화하는 즉시 메뉴를 다시 생성하여 이때 변경된 조건에 맞는 메뉴를 읽어들인다.



"초보자 모드"를 누르고 메뉴를 실행하면 빨간박스가,

"전문가 모드"를 누르고 메뉴를 실행하면 파란박스가 실행된다.



<옵션메뉴.java>

public class Exercise extends Activity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView MyText = new TextView(this);
MyText.setText("메뉴 키를 누르세요.");
setContentView(MyText); }

public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);

MenuItem item=menu.add(0,1,0,"짜장");
item.setIcon(R.drawable.ic_launcher);
item.setAlphabeticShortcut('a');

menu.add(0,2,0, "짬뽕").setIcon(R.drawable.ic_launcher);
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>


<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/jjajang"
android:title="짜장"
android:icon="@drawable/ic_launcher"
android:alphabeticShortcut="a"/>

<item android:id="@+id/jjambbong"
android:title="짬뽕"
android:icon="@drawable/ic_launcher"/>

<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>



<1.3 컨텍스트 메뉴.java>

package lkcompany.exercise;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class Exercise extends Activity {
Button mBtn;
EditText mEdit;
MyImage mImage;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);

mBtn = (Button) findViewById(R.id.button);
registerForContextMenu(mBtn);

mEdit = (EditText) findViewById(R.id.edittext);
registerForContextMenu(mEdit);

mImage = (MyImage) findViewById(R.id.myimage);
registerForContextMenu(mImage);
}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

if (v == mBtn) {
menu.setHeaderTitle("Button Menu");
menu.add(0, 1, 0, "Red");
menu.add(0, 2, 0, "Green");
menu.add(0, 3, 0, "Blue");
}
if (v == mEdit) {
menu.add(0, 4, 0, "번역하기");
menu.add(0, 5, 0, "필기인식");
}

}

public boolean onContextItemSelected (MenuItem item){
switch (item.getItemId()){
case 1:
mBtn.setTextColor(Color.RED);
return true;
case 2:
mBtn.setTextColor(Color.GREEN);
return true;
case 3:
mBtn.setTextColor(Color.BLUE);
return true;
case 4:
Toast.makeText(this, "번역했다.", Toast.LENGTH_SHORT).show();
return true;
case 5:
Toast.makeText(this, "필기인식 했다.", Toast.LENGTH_SHORT).show();
return true;
case 100:
Toast.makeText(this, "회전했다 치고.", Toast.LENGTH_SHORT).show();
case 101:
Toast.makeText(this, "크기 변경했다 치고.", Toast.LENGTH_SHORT).show();
return true;
}

return true;
}
}

class MyImage extends ImageView {
public MyImage(Context context) {
super(context);
}

public MyImage(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void onCreateContextMenu(ContextMenu menu){
super.onCreateContextMenu(menu);

menu.setHeaderTitle("MyImage Menu");
menu.add(0,100,0, "이미지 회전");
menu.add(0,101,0, "크기 변경");
}
}


<!.4 팝업메뉴.xml>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="mOnClick"
android:text="Button"/>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/popup_red"
android:title="Back-Red" />
<item android:id="@+id/popup_green"
android:title="Back-Green" />
<item android:id="@+id/popup_blue"
android:title="Back-Blue" />
<item android:id="@+id/popup_Text"
android:title="TextColor">

<menu>
<item android:id="@+id/popup_black"
android:title="Text-Black"/>
<item android:id="@+id/popup_white"
android:title="Text-White"/>
<item android:id="@+id/popup_gray"
android:title="Text-Gray"/>
</menu>
</item>

</menu>


<1.4 팝업메뉴 java>

public class Exercise extends Activity {
Button mBtn;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);

mBtn = (Button)findViewById(R.id.btn);
}

public void mOnClick(View v){
PopupMenu popup = new PopupMenu (this, v);
MenuInflater inflater = popup.getMenuInflater();
Menu menu = popup.getMenu();
inflater.inflate(R.menu.popupmenutestmenu, menu);

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
public boolean onMenuItemClick(MenuItem item){
switch (item.getItemId()){
case R.id.popup_red:
mBtn.setBackgroundColor(Color.RED);
break;
case R.id.popup_green:
mBtn.setBackgroundColor(Color.GREEN);
break;
case R.id.popup_blue:
mBtn.setBackgroundColor(Color.BLUE);
case R.id.popup_black:
mBtn.setTextColor(Color.BLACK);
break;
case R.id.popup_white:
mBtn.setTextColor(Color.WHITE);
break;
case R.id.popup_gray:
mBtn.setTextColor(Color.GRAY);
break;
}
return false;
}
});
popup.show();
}
}



<2.1 메뉴 편집>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ff0000"
android:text="Button"
android:textSize="20px"
/>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/submenu"
android:title="Sub Menu">

<menu>
<group android:id="@+id/checkable_group"
android:checkableBehavior="all">
<item android:id="@+id/bigfont"
android:title="BigFont"/>

</group>
<group android:id="@+id/exclusive_checkable_group"
android:checkableBehavior="single">
<item android:id="@+id/red"
android:title="Red"
android:checked="true"/>
<item android:id="@+id/green"
android:title="Green"/>
<item android:id="@+id/blue"
android:title="Blue"/>
</group>
</menu>
</item>
</menu>
package lkcompany.exercise;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;

public class Exercise extends Activity {
Button mBtn;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);
mBtn = (Button)findViewById(R.id.button);
}

public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.popupmenutestmenu, menu);

return true;
}

public boolean onPrepareOptionsMenu(Menu menu){
if (mBtn.getTextSize() == 40) {
menu.findItem(R.id.bigfont).setChecked(true);
} else{
menu.findItem(R.id.bigfont).setChecked(false);
}

int color = mBtn.getTextColors().getDefaultColor();

if(color == Color.RED) {
menu.findItem(R.id.red).setChecked(true);
}
if (color == Color.GREEN){
menu.findItem(R.id.green).setChecked(true);
}
if (color == Color.BLUE) {
menu.findItem(R.id.blue).setChecked(true);
}
return true;
}

public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case R.id.bigfont:
if (item.isChecked()) {
mBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20);
} else {
mBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, 40);
}
return true;

case R.id.red:
mBtn.setTextColor(Color.RED);
return true;
case R.id.green:
mBtn.setTextColor(Color.GREEN);
return true;
case R.id.blue:
mBtn.setTextColor(Color.BLUE);
return true;
}
return false;
}
}



<2.2 메뉴교체 begginner>

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="도움말"

android:showAsAction="always|withText"/>

<item android:title="프로그램 소개" />
</menu>


<2.2 메뉴교체 professional>

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="검색"

android:showAsAction="always|withText"/>

<item android:title="추가"

android:showAsAction="always|withText"/>

<item android:title="설정"/>
<item android:title="고급 기능"/>
</menu>


<2.2 메뉴교체.java>

public class Exercise extends Activity {
boolean mBeginner = true;
public void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);
}
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
if(mBeginner){
inflater.inflate(R.menu.beginner, menu);
} else{
inflater.inflate(R.menu.professional, menu);
}
return true;
}
public void mOnClick(View v){
switch (v.getId()){
case R.id.btnbeginner:
mBeginner = true;
invalidateOptionsMenu();
break;
case R.id.btnprofessional:
mBeginner = false;
invalidateOptionsMenu();
break;
}
}

}