[안드로이드 앱 개발] 7.안드로이드 메뉴 다루기
by 습작 | 13.10.28 01:27 | 11,344 hit
* 메뉴 시스템 개요안드로이드 메뉴 시스템은 크게 Options menu and action bar, Context menu and contextual action mode, Popup menu로 구분할 수 있는데 2.3 이하에서는 Options menu, Context menu, Popup menu를 사용하면 되지만 3.0이상에서는 기존 메뉴가 없어지고 대신 Action bar, Contextual action mode, Popup menu를 사용해야 한다.
Options menu : Activity를 위한 메뉴로 사용자가 메뉴 버튼을 클릭하면 나타난다.Action bar : 3.0부터 메뉴 버튼이 없어짐으로 대신 사용하는 것이며 메뉴 아이템들과 Overflow 버튼으로 구성한다.Context menu : 특정 요소(선택한 텍스트나 플레임등)를 길게(2초가량) 클릭하면 나타나는 메뉴Contextual action mode : 3.0부터 Context menu대신 사용해야 하는 것으로 화면 상단에 표시된다.Popup menu : 특정 뷰에 연관하여 아이템 리스트 형태로 표시되는 메뉴
* Options menu기기의 메뉴 버튼을 클릭할 때 표시되는 메뉴로 6개까지 표시하고 6개 이상이면 More로 표시해준다.



* 메뉴만들기여러가지 메뉴 종류가 있지만 작업을 하는 과정을 유사하고 해당 메뉴를 Activity에 붙일지, View에 붙일지등을 선택하면 되므로 Options menu를 만드는 과정으로 살펴보고자 한다. 
우선, 좌측 Package Explorer에서 프로젝트>res를 우측 마우스로 클릭하여 New>Android XML File을 선택한다.




안드로이드 자원의 대부분을 XML로 표현하고 있으므로 작성은 이렇게 시작한다. 아래와 같은 XML 생성 창이 나오면 Resource Type으로 Menu를 선택하고 File에 XML 파일명을 입력한 다음(확장자 제외) Finish를 클릭하면 메뉴 리소스가 생성된다.


안드로이드는 res/menu폴더에 있는 메뉴 XML을 더블클릭하면 아래 그림과 같이 Menu Editor를 제공하여 편집할 수 있도록 하는데, 하단 탭으로 XML 파일을 직접 코딩 할 수도 있으므로 나름 편리한 방법으로 메뉴를 생성한다.


메뉴 편집기에서 I로 표시된것은 메뉴 아이템을 의미하고, G로 된 항목은 메뉴 그룹을 의미한다.
메뉴로 표시할 텍스트 내용을 내부 리소스를 통해 가져오려면 Title 란의 Browse버튼을 클릭하고, "New String"버튼을 통해서 아래와 같은 화면에서 스트링 내용과 아이디를 부여한 다음 메뉴 아이템의 제목으로 선택하면 된다.

메뉴 항목을 추가할 때는 New를 클릭하여 아래와 같은 창에서 메뉴를 추가한다.




위의 과정을 밟아 메뉴를 준비했으면, 해당 메뉴를 사용하도록 코드에 적용하면 되는데, Options menu는 Activity에 연관하여 동작하므로 아래 예제 코드와 같이 Activity코드에 메뉴 관련 Import를 추가하고 추가한 XML 파일명을 메뉴 아이디로 하여 onCreateOptionsMenu를 정의해주면 기기의 메뉴 버튼을 클릭할때 작성한 메뉴가 나온다.

import android.view.Menu;
import android.view.MenuInflater;
......
public class ApiDemos extends ListActivity <
......

@Override
    public boolean onCreateOptionsMenu(Menu menu) <
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
        return true;
    >
>메뉴 항목 2개를 붙여 띄운 options menu 예제이다.


3.0에서 위의 코드를 같은 방식으로 적용하면 아래와 같이 표현된다. 맨 하단 우측 버튼이 2.3이하의 기기에 있던 메뉴 버튼을 대신한다.


메뉴를 클릭 했을때의 처리 로직은 아래와 같이 onOptionsItemSelected 에 각 메뉴 아이템에 대한 처리 로직을 기술해주면 된다.

@Override
public boolean onOptionsItemSelected(MenuItem item) <
    // Handle item selection
    switch (item.getItemId()) <
        case R.id.item1:
            TestMenu();
            return true;
        case R.id.item2:
            showAlert();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    >
>

* Action bar안드로이드 3.0부터 Options menu를 대치하는 것으로 우측 상단에 배치된다. 아래 그림은 검색 어플의 Action Bar를 터치한 스크린샷이다.




* Context menu특정 요소(선택한 텍스트나 플레임등)를 길게(2초가량) 클릭하면 나타나는 메뉴로 아래 그림은 Contact에서 특정 아이템을 길게 선택했을때 나오는 화면이다.



* Context menu 가동시키기Context menu를 가동시키려면 registerForContextMenu()로 뷰 등록>Long click시의 메뉴 생성 로직 작성>메뉴클릭시의 동작 로직 작성의 단계를 거치면 된다.

1. registerForContextMenu()로 뷰 등록하기
Activity onCreate()에 Context menu를 적용할 뷰에 대해서 registerForContextMenu()로 등록해 준다. 아래에 두가지 예제이다.

    @Override
    public void onCreate(Bundle savedInstanceState) <
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallery_1);

        // Reference the Gallery view
        Gallery g = (Gallery) findViewById(R.id.gallery);
        // Set the adapter to our custom adapter (below)
        g.setAdapter(new ImageAdapter(this));
        
        // Set a item click listener, and just Toast the clicked position
        g.setOnItemClickListener(new OnItemClickListener() <
            public void onItemClick(AdapterView parent, View v, int position, long id) <
                Toast.makeText(Gallery1.this, "" + position, Toast.LENGTH_SHORT).show();
            >
        >);
        
        // We also want to show context menu for longpressed items in the gallery
        registerForContextMenu(g);
    >
    @Override
    public void onCreate(Bundle savedInstanceState) <
        super.onCreate(savedInstanceState);

        // Set up our adapter
        mAdapter = new MyExpandableListAdapter();
        setListAdapter(mAdapter);
        registerForContextMenu(getExpandableListView());
    >
2. Long click시의 메뉴 생성 로직 작성
onCreateContextMenu에 로직을 기술한다. Options menu 처럼 미리 작성해 놓은 메뉴를 사용하는 방법(예제1)도 있고 실행시점에 add() 직접 만드는 방법도 있다

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) <
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
>
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) <
        menu.setHeaderTitle("Sample menu");
        menu.add(0, 0, 0, R.string.expandable_list_sample_action);
    >
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) <
        menu.add(R.string.gallery_2_text);
    >
3. 메뉴클릭시의 동작 로직 작성

onContextItemSelected에 로직을 기술한다. @Override

public boolean onContextItemSelected(MenuItem item) <
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) <
        case R.id.edit:
            editNote(info.id);
            return true;
        case R.id.delete:
            deleteNote(info.id);
            return true;
        default:
            return super.onContextItemSelected(item);
    >
>
* Contextual action mode안드로이드 3.0부터 Context menu를 대치하는 것으로, Context menu처럼 선택한 특정 아이템에 액션을 부여할 때 사용한다. 아래 그림은 Contact의 특정 아이템을 선택했을때 액션 아이템들이 상단에 나타나는 것을 확인할 수 있다.




* Popup menu특정 뷰에 따라붙는 리스트 형태의 서브 메뉴로 아래 그림은 3.0에서 api demo 예제에 있는 Popup menu를 실행 시킨 화면이다.


Popup menu는 뷰에 종속적인 메뉴로 위에서 언급한 메뉴들 처럼 메뉴 리소스를 이용할 수도 있고, 실행중에 직접 만들 수도 있다. 특정 뷰의 클릭등에 사용자 함수를 실행하도록 하고 해당 함수에서 팝업 메뉴를 띄우고 사용자 반응을 확인한다.

아래 예제는 버튼 클릭등에 팝업 메뉴를 가동시킨 사례이다.

public void showPopup(View v) <
    PopupMenu popup = new PopupMenu(this, v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.actions, popup.getMenu());
    popup.show();
>

public void showMenu(View v) <
    PopupMenu popup = new PopupMenu(this, v);

    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
>

팝업 메뉴의 개별 항목 클릭시 처리 로직은 setOnMenuItemClickListener로 리스너를 설정하고 아래 예제와 같이 onMenuItemClick에서 처리하면 된다. 

@Override
public boolean onMenuItemClick(MenuItem item) <
    switch (item.getItemId()) <
        case R.id.archive:
            archive(item);
            return true;
        case R.id.delete:
            delete(item);
            return true;
        default:
            return false;
    >
>

참조문서 : http://developer.android.com/guide/topics/ui/menus.html
추천 1

댓글 12

벽하거사 2013.11.14 16:51
많은 도움이 되었습니다.
고맙습니다..
한여름날의꿈 2013.10.29 11:08
정보 감사합니다 ㅎ
천방지축 2013.10.29 10:39
감사합니다....
사막의장미 2013.10.29 10:36
생각보다 복잡하네요~그래서 버그도 있고 업데이트도 하나 봅니다~
세계를품다 2013.10.29 08:12
가암사
Oollalla 2013.10.29 00:24
좋은 정보 감사합니다. 
zkdlfm 2013.10.28 18:29
어려워요 ㅎㅎ
라떼로주세요 2013.10.28 17:44
어렵네요^^;;;
길태 2013.10.28 15:54
흠.계속 어려움..
서현서진서율아빠 2013.10.28 15:33
어려워....
개발자 말고 사용자만 해야지....^^;
알람방구 2013.10.28 13:46
감사합니다.
뽀대 2013.10.28 13:42
정말 주옥같은 글귀네요~
물론 알아보지못하지만요~

이거슨 꿀팁 다른 게시글

게시물 더보기

이거슨 꿀팁 인기 게시글

  1. 알뜰폰 쓸 때 인터넷과 결합하려면2,639
  2. 해외여행 갈 때 데이터로밍 간편하고 싸게 쓰…2,506
  3. 기프티콘은 컬쳐랜드 쿠폰거래소에서 이용하…2,392
  4. 클리오 루즈힐 블룸 다이아 립스틱 5종 홈쇼…2,493
  5. 데이터 10GB+1Mbps 무제한 6,500원부터 쓸수…2,353
  6. 3월 알뜰폰 가성비 평생요금제 2가지 6GB 6천…2,098
  7. 3Mbps 속도 데이터무제한 최저가 검색2,100
  8. 컬쳐랜드에 쿠폰거래소가 새롭게 생겼어요2,062
  9. 해외여행 데이터로밍 일본 태국 대만 최저가…2,042
  10. 아싸컴에서 천만원 이벤트 하는 거 찾았다2,011

2024.05.17 01:00 기준