메뉴 추가

Compose 방식 사용해 보기
Jetpack Compose는 Android에 권장되는 UI 도구 키트입니다. Compose에서 구성요소를 추가하는 방법을 알아보세요.
<ph type="x-smartling-placeholder"></ph> TopAppBar → 를 통해 개인정보처리방침을 정의할 수 있습니다.

메뉴는 여러 유형의 앱에서 일반적인 사용자 인터페이스 구성요소입니다. 받는사람 사용자에게 익숙하고 일관된 사용자 환경을 제공하려면 Menu API 대상 액티비티에서 사용자 작업과 기타 옵션을 보여줍니다.

<ph type="x-smartling-placeholder">를 통해 개인정보처리방침을 정의할 수 있습니다. <ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">더보기 메뉴의 예를 보여주는 이미지</ph> <ph type="x-smartling-placeholder">
</ph> 그림 1. 아이콘을 탭하면 실행되는 메뉴 더보기 메뉴 아이콘 아래에 표시됩니다.

이 문서에서는 세 가지 기본적인 유형의 메뉴나 Android의 모든 버전에서 작동하는 프레젠테이션은 다음과 같습니다.

옵션 메뉴 및 앱 바
옵션 메뉴는 비즈니스의 기본 메뉴 항목 모음입니다. 있습니다. 여기에 전 세계에 영향을 미치는 작업을 '검색'과 같은 "이메일 작성" '설정'을 클릭합니다.

옵션 만들기 메뉴를 참고하세요. 섹션으로 이동합니다.

컨텍스트 메뉴 및 상황별 작업 모드
컨텍스트 메뉴는 플로팅 메뉴입니다. 사용자가 터치 & 유지할 수 있습니다. 그것은 는 선택한 콘텐츠나 컨텍스트 프레임에 영향을 미치는 작업을 제공합니다.

상황별 작업 모드는 화면 상단의 바에서 선택한 콘텐츠에 영향을 주며, 사용자가 여러 항목을 선택할 수 있습니다.

컨텍스트 메뉴 만들기를 참고하세요. 섹션으로 이동합니다.

팝업 메뉴
팝업 메뉴는 메뉴를 호출합니다. 다양한 작업을 제공하는 데 유용합니다. 특정 콘텐츠와 관련이 있거나 두 번째 부분의 옵션을 제공하는 데 사용됩니다. 실행할 수 있습니다 팝업 메뉴의 작업은 이는 상황별 작업이 목적입니다. 그보다는 팝업 메뉴는 확인할 수 있습니다.

팝업 메뉴 만들기 섹션을 참고하세요.

XML로 메뉴 정의

Android는 모든 메뉴 유형에 대해 메뉴를 정의하는 표준 XML 형식을 제공합니다. 개의 항목이 있습니다. 활동 코드에서 메뉴를 빌드하는 대신 메뉴를 정의하고 모든 항목을 XML 형식으로 메뉴 리소스. 다음과 같은 작업을 할 수 있습니다. 그런 다음 메뉴 리소스를 확장하여 Menu로 로드합니다. 객체입니다.

메뉴 리소스를 사용하는 것이 좋은 이유는 다음과 같습니다.

  • 메뉴 구조를 XML로 시각화하기가 더 쉽습니다.
  • 메뉴의 콘텐츠를 앱의 동작과 구분 있습니다.
  • 다양한 플랫폼에 맞는 대체 메뉴 구성을 만들 수 있습니다. 버전, 화면 크기 및 기타 구성을 앱 리소스 프레임워크입니다

메뉴를 정의하려면 프로젝트의 res/menu/ 디렉터리를 만들고 다음을 사용하여 메뉴를 빌드합니다. 요소:

<menu>
메뉴 항목의 컨테이너인 Menu를 정의합니다. 가 <menu> 요소는 파일의 루트 노드여야 합니다. 하나 이상의 <item><group>을(를) 보유할 수 있습니다. 요소
<item>
MenuItem, 메뉴 내의 단일 항목을 나타냅니다. 이 요소에는 중첩된 <menu> 요소를 사용하여 하위 메뉴를 만듭니다.
<group>
<item>의 보이지 않는 컨테이너(선택사항) 요소 이를 통해 메뉴 항목을 분류하여 다음과 같은 속성을 공유할 수 있습니다. 활성 상태와 가시성으로 지정할 수 있습니다 자세한 내용은 메뉴 그룹 만들기 섹션.

다음은 game_menu.xml이라는 예시 메뉴입니다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:icon="@drawable/ic_new_game"
          android:title="@string/new_game"
          app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>

<item> 요소는 사용할 수 있는 여러 속성을 지원합니다. 항목의 모양과 동작을 정의할 수 있습니다. 이전 메뉴의 항목 다음 속성을 포함합니다.

android:id
항목에 고유한 리소스 ID로, 앱에서 이 ID를 통해 항목을 인식할 때 사용자가 선택합니다.
android:icon
항목의 아이콘으로 사용할 수 있는 드로어블에 관한 참조입니다.
android:title
항목의 제목으로 사용할 문자열에 관한 참조입니다.
android:showAsAction
이 항목이 작업 항목으로 표시되는 시기와 방법에 관한 사양 을 클릭합니다.

이것들은 사용하는 가장 중요한 속성이지만, 이보다 더 많은 속성이 있습니다 있습니다. 지원되는 모든 속성에 대한 자세한 내용은 메뉴 리소스 문서를 참조하세요.

모든 메뉴의 항목에 하위 메뉴를 추가하려면 <item>의 하위 요소로서의 <menu> 요소. 하위 메뉴는 앱에 정리할 수 있는 기능이 많을 때 유용합니다. PC 앱의 메뉴 바에 있는 항목(예: 파일, 수정보기. 아래 예를 참고하세요.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file"
          android:title="@string/file" >
        <!-- "file" submenu -->
        <menu>
            <item android:id="@+id/create_new"
                  android:title="@string/create_new" />
            <item android:id="@+id/open"
                  android:title="@string/open" />
        </menu>
    </item>
</menu>

활동에서 메뉴를 사용하려면 메뉴 리소스를 _확장_하여 프로그래밍 가능한 객체로 XML 리소스를 MenuInflater.inflate() 다음 섹션에서는 각 메뉴 유형의 메뉴를 확장하는 방법을 보여줍니다.

옵션 메뉴 만들기

그림 1과 같은 옵션 메뉴에서는 현재 활동 컨텍스트와 관련된 작업 및 기타 옵션을 예: '검색' "이메일 작성" '설정'을 클릭합니다.

Google Sheets 앱의 앱 바를 보여주는 이미지
그림 2. Google Sheets 앱이 작업 오버플로 버튼을 포함한 여러 버튼이 있습니다.

메뉴에서 옵션 메뉴 항목을 선언할 수 있습니다. Activity 서브클래스 또는 Fragment 서브클래스로 만듭니다. 활동과 프래그먼트가 모두 옵션 메뉴, 항목이 UI에 결합되어 있습니다. 활동의 항목이 표시됩니다. 먼저 각 프래그먼트의 프래그먼트가 나오며 각 프래그먼트의 프래그먼트가 알 수 있습니다. 필요한 경우 메뉴 항목을 다시 정렬하려면 android:orderInCategory 속성을 <item> 이동해야 합니다.

활동의 옵션 메뉴를 지정하려면 재정의하세요. onCreateOptionsMenu() 프래그먼트는 자체 onCreateOptionsMenu() 있습니다. 이 메서드에서는 메뉴 리소스를 확장하여 XML로 정의된 값을Menu 있습니다. 예를 들면 다음과 같습니다.

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.game_menu, menu)
    return true
}

자바

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

메뉴 항목을 추가할 수도 있습니다. add() 사용하여 항목을 검색할 수 있으며 findItem() MenuItem API를 사용하여 속성을 수정합니다.

클릭 이벤트 처리

사용자가 옵션 메뉴에서 작업 항목을 포함한 항목을 선택할 때 앱이 실행 중일 때 시스템이 활동의 onOptionsItemSelected() 메서드를 사용하여 축소하도록 요청합니다. 이 메서드가 선택된 MenuItem을 전달합니다. 사용자는 를 호출하여 항목을 getItemId(), 이는 메뉴 리소스의 android:id 속성 또는 주어진 정수 add() 메서드에 전달합니다. 이 ID를 알려진 메뉴와 일치시킬 수 있습니다. 항목을 사용하여 적절한 작업을 수행합니다.

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection.
    return when (item.itemId) {
        R.id.new_game -> {
            newGame()
            true
        }
        R.id.help -> {
            showHelp()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

자바

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection.
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

메뉴 항목을 성공적으로 처리한 경우 true를 반환합니다. 만약 메뉴 항목을 처리하지 않는 경우 onOptionsItemSelected() 기본 구현은 다음을 반환합니다. false입니다.

활동에 프래그먼트가 포함되어 있으면 시스템은 먼저 활동에 onOptionsItemSelected(), 각 프래그먼트에 적용 프래그먼트가 추가된 순서대로 true 또는 모든 프래그먼트가 호출됩니다.

<ph type="x-smartling-placeholder">

런타임 시 메뉴 항목 변경

시스템이 onCreateOptionsMenu()를 호출한 후 채우고 호출하지 않는 Menu의 인스턴스 onCreateOptionsMenu()를 다시 실행합니다. 그러나 onCreateOptionsMenu()는 초기 메뉴를 만들 때만 사용합니다. 상태를 유지하고 활동 수명 주기 동안 변경하지 않아야 합니다.

기간 중 발생하는 이벤트를 기준으로 옵션 메뉴를 수정하려는 경우 이 작업은 onPrepareOptionsMenu() 메서드를 사용하여 축소하도록 요청합니다. 이 메서드는 현재와 같이 Menu 객체를 전달합니다. 따라서 항목을 추가, 삭제 또는 사용 중지하는 등의 방법으로 수정할 수 있습니다. 또한 프래그먼트는 onPrepareOptionsMenu() 있습니다.

메뉴 항목이 표시되면 항상 열려 있는 것으로 간주됩니다. 앱 바 이벤트가 발생하고 메뉴 업데이트를 수행하려는 경우 invalidateOptionsMenu() 시스템이 onPrepareOptionsMenu()를 호출하도록 요청합니다.

<ph type="x-smartling-placeholder">

컨텍스트 메뉴 만들기

플로팅 컨텍스트 메뉴를 보여주는 이미지
그림 3. 플로팅 컨텍스트 메뉴

컨텍스트 메뉴는 특정 항목이나 컨텍스트에 영향을 미치는 작업을 제공합니다. UI의 프레임에 표시됩니다. 모든 보기에 컨텍스트 메뉴를 제공할 수 있지만, 자주 사용되는 RecylerView 또는 사용자가 각각에 직접 작업을 수행할 수 있는 다른 뷰 컬렉션 있습니다.

상황별 작업을 제공하는 방법에는 두 가지가 있습니다.

  • 첫째, 플로팅 컨텍스트 메뉴를 사용합니다. 메뉴 메뉴 항목의 부동 목록으로 표시되며, 메뉴 항목의 사용자가 터치 및 컨텍스트 지원을 선언하는 뷰 유지 선택합니다. 사용자는 한 항목에서 한 번에 하나의 상황별 작업을 수행할 수 있습니다.
  • 둘째, 상황별 작업 모드를 사용합니다. 이 모드는 시스템입니다. 구현해 보겠습니다. ActionMode 를 사용하면 페이지 상단에 상황별 작업 모음, 즉 CAB를 선택한 항목에 영향을 주는 작업 항목이 표시된 화면 이 모드가 활성 상태인 경우 사용자가 한 번에 여러 항목에 대해 작업을 수행할 수 있습니다. 지원합니다.

참고: 컨텍스트 메뉴에서는 항목 바로가기 및 항목 아이콘이 지원되지 않습니다.

플로팅 컨텍스트 메뉴 만들기

플로팅 컨텍스트 메뉴를 제공하려면 다음 단계를 따르세요.

  1. 컨텍스트 메뉴가 연결된 View 등록 통화 registerForContextMenu() View에 전달합니다.

    활동에서 RecyclerView를 사용하고 각 객체를 항목을 사용하여 동일한 컨텍스트 메뉴를 제공하고 컨텍스트에 대해 모든 항목을 등록합니다. RecyclerViewregisterForContextMenu()입니다.

  2. 구현: onCreateContextMenu() Activity 또는 Fragment 메서드에 전달합니다.

    등록된 뷰가 터치 및 이벤트가 발생하면 시스템은 onCreateContextMenu() 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다. 여기에서 일반적으로 다음과 같이 메뉴 리소스를 확장하여 메뉴 항목을 확장합니다. 예:

    Kotlin

        override fun onCreateContextMenu(menu: ContextMenu, v: View,
                                menuInfo: ContextMenu.ContextMenuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo)
            val inflater: MenuInflater = menuInflater
            inflater.inflate(R.menu.context_menu, menu)
        }
        

    자바

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

    MenuInflater 메뉴 리소스에서 컨텍스트 메뉴를 확장할 수 있습니다. 콜백 메서드 매개변수에는 사용자가 선택하는 ViewContextMenu.ContextMenuInfo 선택한 항목에 대한 추가 정보를 제공하는 객체입니다. 만약 액티비티에는 각각 다른 컨텍스트 메뉴를 제공하는 여러 뷰가 있습니다. 이 매개변수를 사용하여 광고를 표시할 컨텍스트 메뉴를 확장할 수 있습니다.

  3. 구현 onContextItemSelected(), 다음 예와 같이 됩니다. 사용자가 메뉴 항목을 선택하면 시스템이 이 메서드를 호출하므로 개발자가 적절한 작업을 수행할 수 있습니다.

    Kotlin

        override fun onContextItemSelected(item: MenuItem): Boolean {
            val info = item.menuInfo as AdapterView.AdapterContextMenuInfo
            return when (item.itemId) {
                R.id.edit -> {
                    editNote(info.id)
                    true
                }
                R.id.delete -> {
                    deleteNote(info.id)
                    true
                }
                else -> super.onContextItemSelected(item)
            }
        }
        

    자바

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

    getItemId() 메서드는 선택된 메뉴 항목의 ID를 쿼리하여 각 메뉴 항목에 다음과 같이 android:id 속성을 사용하여 XML의 메뉴 항목 XML로 메뉴를 정의합니다.

    메뉴 항목을 성공적으로 처리한 경우 true를 반환합니다. 만약 메뉴 항목을 처리하지 않는 경우 메뉴 항목을 슈퍼클래스에 전달합니다. 있습니다. 활동에 프래그먼트가 포함되어 있으면 이 콜백을 먼저 호출합니다. 처리되지 않을 때 슈퍼클래스를 호출하면 시스템은 는 이벤트를 각 프래그먼트의 해당 콜백 메서드에 전달합니다. true 또는 false가 반환됩니다. 기본 구현은 Activityandroid.app.Fragment 반환 false이므로 처리되지 않을 때는 항상 슈퍼클래스를 호출합니다.

상황별 작업 모드 사용

상황별 작업 모드는 ActionMode: 사용자 상호작용을 실행에 집중 작업을 수행할 수 있습니다 사용자가 항목을 선택하여 이 모드를 활성화하면 화면 상단에 표시되는 상황별 작업 모음으로 사용자가 선택한 항목에 대해 수행할 수 있는 작업 이 모드가 활성화된 동안에는 사용자가 여러 항목을 선택할 수 있습니다(앱에서 지원하는 경우). 활동 내에서 탐색을 계속합니다. 작업 모드가 사용 중지되었습니다. 사용자가 모든 항목을 선택 해제하면 상황별 작업 모음이 사라집니다. 뒤로 버튼을 탭하거나 화면 왼쪽의 완료 작업을 있습니다.

<ph type="x-smartling-placeholder">

상황별 작업을 제공하는 뷰의 경우, 일반적으로 컨텍스트 기반 다음 두 이벤트 중 하나 또는 둘 다 발생할 때 '작업 모드'로 설정합니다.

  • 사용자가 터치 및 뷰를 유지할 수 있습니다.
  • 사용자가 뷰 내에서 체크박스 또는 그와 유사한 UI 구성 요소를 선택하는 경우.

앱이 상황별 작업 모드를 호출하고 설계에 따라 다릅니다 두 가지 디자인이 있습니다.

  • 개별적 임의 뷰와 관련된 상황별 작업을 위한 경우.
  • 그룹 내의 항목 그룹에 대한 일괄 상황별 작업의 경우 RecyclerView: 사용자가 여러 항목을 선택할 수 있고 모든 기기에 작업을 수행할 수 있습니다

다음 섹션은 각 시나리오에 필요한 설정을 설명합니다.

개별 뷰에 상황별 작업 모드 사용 설정

사용자가 선택할 때만 상황별 작업 모드를 호출하려는 경우 다음과 같이 하세요.

  1. 다음과 같이 ActionMode.Callback 인터페이스를 구현합니다. 다음 예를 참고하세요. 콜백 메서드에서 상황별 작업 모음, 작업 항목에 대한 클릭 이벤트에 응답 작업 모드의 다른 수명 주기 이벤트를 처리합니다.

    Kotlin

        private val actionModeCallback = object : ActionMode.Callback {
            // Called when the action mode is created. startActionMode() is called.
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                // Inflate a menu resource providing context menu items.
                val inflater: MenuInflater = mode.menuInflater
                inflater.inflate(R.menu.context_menu, menu)
                return true
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false // Return false if nothing is done
            }
    
            // Called when the user selects a contextual menu item.
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return when (item.itemId) {
                    R.id.menu_share -> {
                        shareCurrentItem()
                        mode.finish() // Action picked, so close the CAB.
                        true
                    }
                    else -> false
                }
            }
    
            // Called when the user exits the action mode.
            override fun onDestroyActionMode(mode: ActionMode) {
                actionMode = null
            }
        }
        

    자바

        private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
    
            // Called when the action mode is created. startActionMode() is called.
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // Inflate a menu resource providing context menu items.
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.context_menu, menu);
                return true;
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false; // Return false if nothing is done.
            }
    
            // Called when the user selects a contextual menu item.
            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
               switch (item.getItemId()) {
                    case R.id.menu_share:
                        shareCurrentItem();
                        mode.finish(); // Action picked, so close the CAB.
                        return true;
                    default:
                        return false;
                }
            }
    
            // Called when the user exits the action mode.
            @Override
            public void onDestroyActionMode(ActionMode mode) {
                actionMode = null;
            }
        };
        

    이러한 이벤트 콜백은 옵션 메뉴(각각 이벤트와 연결된 ActionMode 객체도 전달합니다. ActionMode API를 사용하여 CAB(예: API 웹 서버)를 사용하여 setTitle()setSubtitle(), 이는 선택된 항목의 수를 나타내는 데 유용합니다.

    위 샘플은 actionMode 변수를 다음과 같이 설정합니다. 작업 모드가 소멸될 때 null입니다. 다음 단계에서 초기화 방법, 활동 또는 활동에서 멤버 변수를 저장하는 방법 프래그먼트가 유용할 수 있습니다.

  2. 전화걸기 startActionMode() 막대를 표시하려는 경우(예: 사용자가 터치 및 뷰를 유지할 수 있습니다.

    Kotlin

        someView.setOnLongClickListener { view ->
            // Called when the user performs a touch & hold on someView.
            when (actionMode) {
                null -> {
                    // Start the CAB using the ActionMode.Callback defined earlier.
                    actionMode = activity?.startActionMode(actionModeCallback)
                    view.isSelected = true
                    true
                }
                else -> false
            }
        }
        

    자바

        someView.setOnLongClickListener(new View.OnLongClickListener() {
            // Called when the user performs a touch & hold on someView.
            public boolean onLongClick(View view) {
                if (actionMode != null) {
                    return false;
                }
    
                // Start the CAB using the ActionMode.Callback defined earlier.
                actionMode = getActivity().startActionMode(actionModeCallback);
                view.setSelected(true);
                return true;
            }
        });
        

    startActionMode()를 호출하면 시스템에서 다음을 반환합니다. ActionMode 생성됨. 이것을 멤버 변수에 저장하면 다른 이벤트에 대한 응답으로 상황별 작업 모음을 변경할 수 있습니다. 이전 샘플에서 ActionModeActionMode 인스턴스는 이미 생성된 경우 다시 생성되지 않습니다. 작업을 시작하기 전에 구성원이 null인지 확인하여 활성 있습니다.

팝업 메뉴 만들기

오른쪽 상단의 더보기 버튼에 고정된 Gmail 앱의 팝업 메뉴를 보여주는 이미지입니다.
그림 4. Gmail 앱의 팝업 메뉴 오른쪽에 있는 더보기 버튼에 고정됩니다.

PopupMenu View에 고정된 모달 메뉴입니다. 앵커 아래에 표시됩니다. 여유 공간이 있으면 뷰, 그렇지 않으면 뷰 위로 이동합니다. 이는 있습니다.

  • 관련 작업에 더보기 스타일 메뉴 제공 특정 콘텐츠(예: Gmail의 이메일 헤더)에 노출될 수 있습니다.
  • 표시된 버튼과 같이 명령 문장의 두 번째 부분을 제공 다른 Add가 있는 팝업 메뉴를 생성하는 Add 있습니다.
  • 유사한 메뉴 제공 Spinner 두 개의 레이어가 있습니다.

XML로 메뉴를 정의하는 경우 팝업 메뉴:

  1. 생성자를 사용하여 PopupMenu를 인스턴스화합니다. 생성자는 현재 앱 Context 및 메뉴가 고정된 View입니다.
  2. MenuInflater를 사용하여 메뉴 리소스를 다음에서 반환한 Menu 객체 PopupMenu.getMenu()입니다.
  3. PopupMenu.show()를 호출합니다.

예를 들어 다음은 팝업 메뉴를 표시하는 버튼입니다.

<ImageButton
    android:id="@+id/dropdown_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/descr_overflow_button"
    android:src="@drawable/arrow_drop_down" />

그러면 활동이 이렇게 팝업 메뉴를 표시할 수 있습니다.

Kotlin

findViewById<ImageButton>(R.id.dropdown_menu).setOnClickListener {
    val popup = PopupMenu(this, it)
    val inflater: MenuInflater = popup.menuInflater
    inflater.inflate(R.menu.actions, popup.menu)
    popup.show()
}

자바

findViewById(R.id.dropdown_menu).setOnClickListener(v -> {
    PopupMenu popup = new PopupMenu(this, v);
    popup.getMenuInflater().inflate(R.menu.actions, popup.getMenu());
    popup.show();
});

사용자가 항목을 선택하거나 메뉴 외부를 탭하면 메뉴가 닫힙니다. 영역입니다. 다음 명령어를 사용하여 닫기 이벤트를 수신 대기할 수 있습니다. PopupMenu.OnDismissListener

클릭 이벤트 처리

사용자가 메뉴 항목을 선택할 때 작업을 실행하려면 PopupMenu.OnMenuItemClickListener 인터페이스를 만들고 다음을 호출하여 PopupMenu에 등록합니다. setOnMenuItemclickListener()입니다. 사용자가 항목을 선택하면 시스템은 onMenuItemClick() 합니다.

예를 들면 다음과 같습니다.

Kotlin

fun showMenu(v: View) {
    PopupMenu(this, v).apply {
        // MainActivity implements OnMenuItemClickListener.
        setOnMenuItemClickListener(this@MainActivity)
        inflate(R.menu.actions)
        show()
    }
}

override fun onMenuItemClick(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.archive -> {
            archive(item)
            true
        }
        R.id.delete -> {
            delete(item)
            true
        }
        else -> false
    }
}

자바

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

    // This activity implements OnMenuItemClickListener.
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

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

메뉴 그룹 만들기

메뉴 그룹은 특정한 특징을 공유하는 메뉴 항목의 컬렉션입니다. 이 다음 작업을 수행할 수 있습니다.

  • 다음을 사용하여 모든 항목 표시 또는 숨기기 setGroupVisible()
  • 다음을 사용하여 모든 항목 사용 또는 사용 중지 setGroupEnabled()
  • 다음을 사용하여 모든 항목을 선택할 수 있는지 여부를 지정합니다. setGroupCheckable()

내부에 <item> 요소를 중첩하여 그룹을 만들 수 있습니다. 메뉴 리소스에 <group> 요소를 적용하거나 그룹 ID를 <ph type="x-smartling-placeholder">add()</ph> 메서드를 사용하여 축소하도록 요청합니다.

다음은 그룹을 포함하는 메뉴 리소스의 예입니다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_save"
          android:icon="@drawable/menu_save"
          android:title="@string/menu_save" />
    <!-- menu group -->
    <group android:id="@+id/group_delete">
        <item android:id="@+id/menu_archive"
              android:title="@string/menu_archive" />
        <item android:id="@+id/menu_delete"
              android:title="@string/menu_delete" />
    </group>
</menu>

그룹에 있는 항목은 첫 번째 항목과 같은 수준으로 표시됩니다. 항목 - 메뉴의 세 항목은 모두 형제입니다. 그러나 그룹 ID를 참조하고 이전 메서드와 동일합니다. 또한 시스템은 그룹화된 항목은 절대 분리하지 않습니다. 대상 예를 들어 android:showAsAction="ifRoom"를 선언하면 둘 다 작업 표시줄에 표시되거나 작업에 모두 표시됩니다. 있습니다.

선택 가능한 메뉴 항목 사용

<ph type="x-smartling-placeholder">
그림 5. 하위 메뉴 선택할 수 있는 항목을 찾습니다.

메뉴는 독립 실행형 옵션의 체크박스 또는 상호 연결 그룹의 라디오 버튼 사용할 수 없습니다. 그림 5는 라디오 버튼

<ph type="x-smartling-placeholder">

각 메뉴 항목의 선택 가능한 동작을 정의할 때는 <item>android:checkable 속성 요소 또는 android:checkableBehavior가 포함된 전체 그룹에 대해 속성을 <group> 요소에 넣습니다. 예를 들어 이 메뉴 그룹은 라디오 버튼으로 선택할 수 있습니다

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item android:id="@+id/red"
              android:title="@string/red" />
        <item android:id="@+id/blue"
              android:title="@string/blue" />
    </group>
</menu>

android:checkableBehavior 속성은 다음 중 하나를 허용합니다. 있습니다.

single
그룹에서 하나의 항목만 선택할 수 있으므로 라디오가 표시됩니다. 버튼을 클릭합니다.
all
모든 항목을 선택할 수 있으며, 이렇게 하면 체크박스가 표시됩니다.
none
선택 가능한 항목이 없습니다.

다음과 같이 항목에 기본 선택 상태를 적용할 수 있습니다. <item> 요소의 android:checked 속성 코드 내에서 <ph type="x-smartling-placeholder">setChecked()</ph> 메서드를 사용하여 축소하도록 요청합니다.

선택 가능한 항목이 선택되면 시스템에서 각 항목을 호출합니다. 항목 선택 콜백 메서드(예: onOptionsItemSelected()) 여기에서 체크박스의 상태를 설정합니다. 체크박스나 라디오가 버튼의 상태가 자동으로 변경되지 않습니다. 현재 상태를 쿼리하여 사용자가 선택하기 전과 마찬가지로 isChecked() 그런 다음 setChecked()로 확인된 상태를 설정합니다. 이 내용은 다음에서 확인할 수 있습니다. 다음 예를 참고하세요.

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.vibrate, R.id.dont_vibrate -> {
            item.isChecked = !item.isChecked
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

자바

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.vibrate:
        case R.id.dont_vibrate:
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

이런 방식으로 선택 상태를 설정하지 않으면 체크박스 또는 라디오 버튼은 사용자가 선택해도 변경되지 않습니다. 수행해야 하는 작업 상태를 설정하면 Activity가 항목의 선택된 상태를 보존하므로 사용자가 나중에 메뉴를 열면 설정된 선택 상태가 표시됩니다.

<ph type="x-smartling-placeholder">

인텐트를 기반으로 메뉴 항목 추가

메뉴 항목이 Intent, 내 앱 또는 다른 앱에서의 활동인지에 관한 정보입니다. 개발자가 사용하려는 인텐트를 알고 startActivity() 항목 선택 시 적절한 콜백 메서드(예: onOptionsItemSelected() 콜백.

하지만 사용자의 기기에 처리할 수 있습니다. 그러면 이를 호출하는 메뉴 항목을 추가하면 작동하지 않을 수도 있습니다. 이 문제를 해결하기 위해 Android에서는 사용자가 메뉴 항목을 생성할 때 동적으로 메뉴 항목을 Android가 기기에서 인텐트를 처리하는 활동을 찾습니다.

인텐트를 수락하는 이용 가능한 활동을 기반으로 메뉴 항목을 추가하려면, 다음과 같습니다.

  1. 카테고리로 인텐트 정의 CATEGORY_ALTERNATIVE 또는 CATEGORY_SELECTED_ALTERNATIVE, 또는 둘 다, 기타 요구사항을 지정할 수 있습니다
  2. 전화걸기 Menu.addIntentOptions() 그러면 Android는 인텐트를 수행할 수 있는 모든 앱을 검색하고 메뉴에 추가합니다.

인텐트를 충족하는 앱이 설치되어 있지 않으면 메뉴가 없습니다. 개의 항목이 추가됩니다.

<ph type="x-smartling-placeholder">

예를 들면 다음과 같습니다.

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    super.onCreateOptionsMenu(menu)

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the menu. The offering app must include a category value
    // of Intent.CATEGORY_ALTERNATIVE.
    val intent = Intent(null, dataUri).apply {
        addCategory(Intent.CATEGORY_ALTERNATIVE)
    }

    // Search and populate the menu with acceptable offering apps.
    menu.addIntentOptions(
            R.id.intent_group,  // Menu group to which new items are added.
            0,                  // Unique item ID (none).
            0,                  // Order for the items (none).
            this.componentName, // The current activity name.
            null,               // Specific items to place first (none).
            intent,             // Intent created above that describes the requirements.
            0,                  // Additional flags to control items (none).
            null)               // Array of MenuItems that correlate to specific items (none).

    return true
}

자바

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

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the menu. The offering app must include a category value
    // of Intent.CATEGORY_ALTERNATIVE.
    Intent intent = new Intent(null, dataUri);
    intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

    // Search and populate the menu with acceptable offering apps.
    menu.addIntentOptions(
         R.id.intent_group,         // Menu group to which new items are added.
         0,                         // Unique item ID (none).
         0,                         // Order for the items (none).
         this.getComponentName(),   // The current activity name.
         null,                      // Specific items to place first (none).
         intent,                    // Intent created above that describes the requirements.
         0,                         // Additional flags to control items (none).
         null);                     // Array of MenuItems that correlate to specific items (none).

    return true;
}

인텐트와 일치하는 인텐트 필터를 제공하는 발견된 각 활동에 대해 인텐트 필터의 android:label를 메뉴 항목 제목으로, 앱 아이콘을 메뉴로 설정합니다. 항목 아이콘을 탭합니다. addIntentOptions() 메서드는 메뉴 항목이 추가되었습니다.

<ph type="x-smartling-placeholder">

다른 메뉴에 활동 추가

다른 앱에 활동 서비스를 제공하여 앱이 다음과 같이 되도록 할 수 있습니다. 다른 역할 메뉴에 포함되어 있는 것을 볼 수 있습니다. 앞에서 설명한 역할을 반대로 합니다.

다른 앱 메뉴에 포함하려면 평소와 같이 인텐트 필터를 정의합니다. CATEGORY_ALTERNATIVE 또는 인텐트의 경우 CATEGORY_SELECTED_ALTERNATIVE 값 또는 둘 다 필터 카테고리입니다. 예를 들면 다음과 같습니다.

<intent-filter label="@string/resize_image">
    ...
    <category android:name="android.intent.category.ALTERNATIVE" />
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    ...
</intent-filter>

인텐트 필터 작성에 관해 자세히 알아보기 인텐트 및 인텐트 필터를 참조하세요.