작업 뷰 및 작업 제공자 사용

AndroidX 라이브러리의 Toolbar는 사용자가 앱과 상호작용할 수 있는 다양한 방법을 제공합니다. 작업 추가 및 처리에서는 작업(버튼 또는 메뉴 항목일 수 있음)을 정의하는 방법을 설명합니다. 이 문서에서는 다목적 구성요소 두 가지를 추가하는 방법을 설명합니다.

  • 작업 뷰는 앱 바 내에 풍부한 기능을 제공하는 작업입니다. 예를 들어 검색 작업 뷰를 사용하면 사용자가 활동이나 프래그먼트를 변경하지 않고도 앱 바에 검색 텍스트를 입력할 수 있습니다.
  • 작업 제공자: 고유한 맞춤 레이아웃이 사용된 작업입니다. 작업은 처음에 버튼이나 메뉴 항목으로 표시됩니다. 사용자가 작업을 탭하면 개발자가 정의한 방식대로 작업 제공자가 작업의 동작을 제어합니다. 예를 들어 작업 제공자는 탭에 메뉴를 표시하여 응답할 수 있습니다.

AndroidX는 특수 작업 뷰와 작업 제공자 위젯을 여러 개 제공합니다. 예를 들어 SearchView 위젯은 검색어 입력을 위한 작업 뷰를 구현합니다. ShareActionProvider 위젯은 다른 앱과 정보를 공유하기 위한 작업 제공자를 구현합니다. 자체 작업 뷰와 작업 제공자를 정의할 수도 있습니다.

작업 뷰 추가

작업 뷰를 추가하려면 작업 추가 및 처리에 설명된 대로 툴바의 메뉴 리소스에 <item> 요소를 만듭니다. 다음 속성 중 하나를 <item> 요소에 추가합니다.

  • actionViewClass: 작업을 구현하는 위젯의 클래스입니다.
  • actionLayout: 작업의 구성요소를 설명하는 레이아웃 리소스입니다.

showAsAction 속성을 "ifRoom|collapseActionView" 또는 "never|collapseActionView"로 설정합니다. collapseActionView 플래그는 사용자가 상호작용하지 않을 때 위젯을 표시하는 방법을 나타냅니다. 위젯이 앱 바에 있으면 앱은 위젯을 아이콘으로 표시합니다. 위젯이 더보기 메뉴에 있는 경우 앱은 위젯을 메뉴 항목으로 표시합니다. 사용자가 작업 뷰와 상호작용하면 확장되어 앱 바를 채웁니다.

예를 들어 다음 코드는 앱 바에 SearchView 위젯을 추가합니다.

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

사용자가 위젯과 상호작용하지 않는 경우 앱은 위젯을 android:icon에 지정된 아이콘으로 표시합니다. 앱 바에 공간이 없으면 앱은 작업을 더보기 메뉴에 추가합니다.

선행 및 후행 아이콘이 있는 검색창을 보여주는 이미지입니다.
그림 1. 선행 및 후행 아이콘이 있는 검색창

사용자가 아이콘이나 메뉴 항목을 탭하면 위젯이 확장되어 툴바를 채우므로 사용자가 상호작용할 수 있습니다.

검색창에 포커스를 맞추면 검색 뷰가 열리는 모습을 보여주는 이미지입니다.
그림 2. 검색창에 초점을 맞추면 검색 뷰가 열립니다.

작업을 구성해야 하는 경우 활동의 onCreateOptionsMenu() 콜백에서 구성합니다. getActionView() 메서드를 호출하여 작업 뷰의 객체 참조를 가져올 수 있습니다. 예를 들어 다음 코드는 이전 코드 예에서 정의한 SearchView 위젯의 객체 참조를 가져옵니다.

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_activity_actions, menu)

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

작업 뷰 확장에 응답

작업의 <item> 요소에 collapseActionView 플래그가 있으면 사용자가 작업 뷰와 상호작용할 때까지 앱은 작업 뷰를 아이콘으로 표시합니다. 사용자가 아이콘을 탭하면 내장된 onOptionsItemSelected() 핸들러가 작업 뷰를 확장합니다. 활동 서브클래스가 onOptionsItemSelected() 메서드를 재정의하는 경우 슈퍼클래스가 작업 뷰를 확장할 수 있도록 재정의 메서드가 super.onOptionsItemSelected()를 호출해야 합니다.

작업을 펼치거나 접을 때 어떤 작업을 하려면 MenuItem.OnActionExpandListener를 구현하는 클래스를 정의하고 이 클래스의 멤버를 setOnActionExpandListener()에 전달하면 됩니다. 예를 들어 작업 뷰가 펼쳐지거나 접혀 있는지에 따라 활동을 업데이트할 수 있습니다. 다음 코드 스니펫은 리스너를 정의하고 전달하는 방법을 보여줍니다.

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.options, menu)

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

작업 제공자 추가

작업 제공자를 선언하려면 작업 추가 및 처리에 설명된 대로 툴바의 메뉴 리소스에 <item> 요소를 만듭니다. actionProviderClass 속성을 추가하고 작업 제공자 클래스의 정규화된 클래스 이름으로 설정합니다.

예를 들어 다음 코드는 AndroidX 라이브러리에 정의된 위젯인 ShareActionProvider를 선언합니다. 이 위젯은 앱이 다른 앱과 데이터를 공유할 수 있도록 합니다.

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

이 경우 ShareActionProvider가 자체 그래픽을 제공하므로 위젯의 아이콘을 선언할 필요가 없습니다. 맞춤 액션을 사용 중인 경우 아이콘을 선언하세요.

추가 리소스

  • 상단 앱 바에 공유 작업을 추가하는 예는 ShareActionProvider를 참고하세요.
  • 맞춤 작업 제공자 만들기에 관한 자세한 내용은 ActionProvider를 참고하세요.