반응형

안드로이드는 기본적으로 세가지 메뉴를 가지고 있습니다.


1. Option Menu : 디바이스의 하드웨어 menu키(일부 기기에서는 소프트키로 되어 있습니다.)를 눌렀을 때 아래에서 쑥 올라오는 메뉴

2. Context Menu : 특정 뷰(View)를 오래 누르고 있으면 나타나는 메뉴(일반 PC에서 마우스 오른쪽버튼의 역할)-다음 포스트에서 소개

3. Popup Menu : 특정 명령에 따라 특정 위치에 팝업(Popup)되어 서브 메뉴용도로 사용할 수 있는 메뉴-다다음 포스트에서 소개


이번 포스트는 옵션 메뉴를 만드는 예제소스입니다.

참고로 허니콤(api 10)버전 이후부터 액션바(ActionBar)의 개념이 생기면서 Option 메뉴의 위치가 변경되었습니다.


옵션메뉴(Option Menu)를 액션바 메뉴(Action Bar)메뉴로 사용하게 하였습니다.

안드로이드 폰 중에서 하드웨어 키로 Menu나 Home버튼이 있는 경우는 여전히 아래에서 옵션메뉴가 나타납니다.

반면에 소프트키로 menu나 Home 버튼이 있는 일부 기기(LG g3 등)에서는 액션바(Action Bar)에서 옵션메뉴가 아래로 펼쳐집니다.


아. 물론 하드웨어 키가 있는 기기에서도 옵션메뉴를 눌렀을 때 액션바(Action Bar)에서 나타나게 할 수 있습니다.


먼저 실행 화면입니다.


      하드웨어 메뉴키(GenyMotion)            아래쪽에서 나타나는 옵션메뉴(Option Menu)

     


    

각각의 아이템을 눌렀을 때 Toast 발생



먼저 Java 코드만으로 옵션메뉴를 보여주도록 했습니다.


Menu의 아이템들을 XML의 리소스로 제작하는 방식은 아래 코드에서 주석처리 되어있습니다.

xml 리소스로 메뉴를 제작하실 때는

menu.add() 메소드를 주석처리하시고

getMenuInflater().inflate(R.menu.mainmenu, menu); 부분의 주석을 해제하세요.

그리고 아래 onOptionsItemSelected() 메소드의

2개의 switch문의 주석을 서로 바꾸세요.


소스코드

 MainActivity.java

 public class MainActivity extends Activity {

public static final int DATA_SAVE=1;

public static final int DATA_SEARCH=2;

public static final int DATA_SETTING=3;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

//디바이스의 Menu 버튼이 처음 눌러졋을 때 한번 호출되는 메소드

//Menu의 MenuItem을 설정하는 메소드

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

//java언어에서 바로 MenuItem 추가하기..

//add( Group Id, Item Id, 배치순서, 메튜타이틀);

//Group Id : 메튜아이템을 그룹으로 관리할 때 그룹의 식별값

//Item Id : 각각의 MenuItem을 구별하기 위한 고유 식별값: 위에 final 살수로 선언

//배치순서(order) : add한 순서와 상관없이 배치순서를 정할 대 사용

menu.add(0, DATA_SAVE, 0, "SAVE");

menu.add(0, DATA_SEARCH, 0, "SEARCH");

menu.add(0, DATA_SETTING, 0, "SETTING");

/* res폴더의 menu플더안에 xml로 MenuItem추가하기.(icon 추가)

//mainmenu.xml 파일을 java 객체로 인플레이트(inflate)해서 menu객체에 추가

getMenuInflater().inflate(R.menu.mainmenu, menu);

*/

return super.onCreateOptionsMenu(menu);

}

//디바이스의 Menu 버튼이 눌러질때 마다 매번 호출되는 메소드

//처음 create 할때의 메뉴의 내용을 변경하고 싶을 대 사용하는 메소드

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

return super.onPrepareOptionsMenu(menu);

}

//OptionMenu의 MenuItem 중 하나를 눌렀을 때 자동으로 호출되는 메소드

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch( item.getItemId() ){//눌러진 MenuItem의 Item Id를 얻어와 식별

case DATA_SAVE:

Toast.makeText(this, "SAVE", Toast.LENGTH_SHORT).show();

break;

case DATA_SEARCH:

Toast.makeText(this, "SEARCH", Toast.LENGTH_SHORT).show();

break;

case DATA_SETTING:

Toast.makeText(this, "SETTING", Toast.LENGTH_SHORT).show();

break;

}

/* mainmenu.xml을 사용했을때의 switch 문

switch( item.getItemId() ){//눌러진 MenuItem의 Item Id를 얻어와 식별

case R.id.save:

Toast.makeText(this, "SAVE", Toast.LENGTH_SHORT).show();

break;

case R.id.search:

Toast.makeText(this, "SEARCH", Toast.LENGTH_SHORT).show();

break;

case R.id.setting:

Toast.makeText(this, "SETTING", Toast.LENGTH_SHORT).show();

break;

}

*/

return super.onOptionsItemSelected(item);

}

}




만약 메뉴아이템의 설계를 XML 리소스로 하신다면

res폴더 안에 'menu'라는 이름으로 폴더를 만드세요(절대 이름 틀리면 안됨)

만들어진 menu폴더안에 mainmenu.xml 파일을 하나 추가하세요.


메뉴 XML 리소스 파일

 mainmenu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android" >

    

    <item

        android:id="@+id/save" 

        android:title="SAVE"

        android:icon="@android:drawable/ic_menu_save" />

    

    <item

        android:id="@+id/search" 

        android:title="LOAD"

        android:icon="@android:drawable/ic_menu_search" />

    

    <item

        android:id="@+id/setting" 

        android:title="SETTING"

        android:icon="@android:drawable/ic_menu_edit" />


</menu>

 


이 메뉴아이템들에는 추가적으로 아이콘(icon)를 설정해 주었습니다.

참고로 위의 자바파일에서는 setIcon()메소드로 아이콘을 추가할 수도 있습니다.

다만 최신 버전의 기기에서는 아래에서 나오는 옵션메뉴를 지양는 추세여서 아이콘이 보이지 않습니다.


아이콘이 보이려면 액션바(Action Bar) 메뉴로 나타나도록 해야 합니다.

방법은 간단합니다.

XML 리소르 아이템(item)를 작성할 때 showAsAction:속성만 추가해주면 됩니다.

제어하는 방식은 위의 소스코드와 동일합니다.


Action Bar 메뉴 XML 리소스 파일

 mainmenu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android" >

    

    <item

        android:id="@+id/save" 

        android:title="SAVE"

        android:icon="@android:drawable/ic_menu_save"

        android:showAsAction="ifRoom" />

    

    <item

        android:id="@+id/search" 

        android:title="LOAD"

        android:icon="@android:drawable/ic_menu_search"        

        android:showAsAction="ifRoom" />

    

    <item

        android:id="@+id/setting" 

        android:title="SETTING"

        android:icon="@android:drawable/ic_menu_edit"

        android:showAsAction="ifRoom" />


</menu>

 


ShowAsAction : 주요속성값

 ifRoom

 액션바에 공간이 있다면 보이도록 함(아이콘만 보임)-가장많이 사용

 never 

 액션바의 공간과 상관없이 무조건 숨겨져 있도록 함(메뉴키 또는 Overflow를 눌렀을 때 보임)-Default 값

 always 

 무조건 보이도록 함( 공간이 없다면 겹침. 비추)

 withText

 텍스트와 아이콘을 같이 보이도록 함



액션바 메뉴(Action Bar Menu)로 사용하는 옵션메뉴




반응형

+ Recent posts