다음을 통해 공유


ActionBar가 있는 탭 레이아웃

이 가이드에서는 ActionBar API를 사용하여 Xamarin.Android 애플리케이션에서 탭 사용자 인터페이스를 만드는 방법을 소개하고 설명합니다.

개요

작업 표시줄은 탭, 애플리케이션 ID, 메뉴 및 검색과 같은 주요 기능에 일관된 사용자 인터페이스를 제공하는 데 사용되는 Android UI 패턴입니다. Android 3.0(API 수준 11)에서 Google은 Android 플랫폼에 ActionBar API를 도입했습니다. ActionBar API는 탭 사용자 인터페이스를 허용하는 일관된 모양과 느낌 및 클래스를 제공하기 위해 UI 테마를 도입합니다. 이 가이드에서는 Xamarin.Android 애플리케이션에 작업 표시줄 탭을 추가하는 방법을 설명합니다. 또한 Android 지원 라이브러리 v7을 사용하여 Android 2.1을 대상으로 하는 Xamarin.Android 애플리케이션에 ActionBar 탭을 Android 2.3으로 백포팅하는 방법에 대해서도 설명합니다.

Toolbar 대신 사용해야 ActionBar 하는 보다 일반화된 최신 작업 표시줄 구성 요소입니다(Toolbar대체ActionBar하도록 디자인됨). 자세한 내용은 도구 모음을 참조 하세요.

요구 사항

API 수준 11(Android 3.0) 이상을 대상으로 하는 모든 Xamarin.Android 애플리케이션은 네이티브 Android API의 일부로 ActionBar API에 액세스할 수 있습니다.

ActionBar API 중 일부는 API 수준 7(Android 2.1)로 다시 이식되었으며, Xamarin Android 지원 라이브러리 - V7 패키지를 통해 Xamarin.Android 앱에서 사용할 수 있는 V7 AppCompat 라이브러리를 통해 사용할 수 있습니다.

ActionBar에서 탭 소개

작업 표시줄은 모든 탭을 동시에 표시하고 가장 넓은 탭 레이블의 너비에 따라 모든 탭의 크기를 동일하게 만들려고 합니다. 다음 스크린샷에 설명되어 있습니다.

동일한 크기의 모든 탭이 표시된 ActionBar의 예제 스크린샷

ActionBar가 모든 탭을 표시할 수 없는 경우 가로 스크롤 가능한 보기에서 탭을 설정합니다. 사용자가 왼쪽 또는 오른쪽으로 살짝 밀어 다시 기본 탭을 볼 수 있습니다. Google Play의 이 스크린샷은 다음 예제를 보여줍니다.

가로 스크롤 가능 보기의 탭 예제 스크린샷

작업 표시줄의 각 탭은 조각연결되어야 합니다. 사용자가 탭을 선택하면 애플리케이션에 탭과 연결된 조각이 표시됩니다. ActionBar는 사용자에게 적절한 조각을 표시할 책임이 없습니다. 대신 ActionBar는 ActionBar.ITabListener 인터페이스를 구현하는 클래스를 통해 탭의 상태 변경에 대해 애플리케이션에 알립니다. 이 인터페이스는 탭 상태가 변경될 때 Android에서 호출하는 세 가지 콜백 메서드를 제공합니다.

  • OnTabSelected - 이 메서드는 사용자가 탭을 선택할 때 호출됩니다. 조각을 표시해야 합니다.

  • OnTabReselected - 이 메서드는 탭이 이미 선택되어 있지만 사용자가 다시 선택하면 호출됩니다. 이 콜백은 일반적으로 표시된 조각을 새로 고치거나 업데이트하는 데 사용됩니다.

  • OnTabUnselected - 이 메서드는 사용자가 다른 탭을 선택할 때 호출됩니다. 이 콜백은 사라지기 전에 표시된 조각의 상태를 저장하는 데 사용됩니다.

Xamarin.Android는 클래스의 ActionBar.ITabListener 이벤트와 함께 래핑합니다 ActionBar.Tab . 애플리케이션은 이러한 이벤트 중 하나 이상에 이벤트 처리기를 할당할 수 있습니다. 작업 표시줄 탭이 발생시키는 세 가지 이벤트(각 메서드에 ActionBar.ITabListener대해 하나씩)가 있습니다.

  • TabSelected
  • TabReselected
  • TabUnselected

ActionBar에 탭 추가

ActionBar는 Android 3.0(API 수준 11) 이상이 기본이며 이 API를 최소로 대상으로 하는 모든 Xamarin.Android 애플리케이션에서 사용할 수 있습니다.

다음 단계에서는 Android 활동에 ActionBar 탭을 추가하는 방법을 보여 줍니다.

  1. OnCreate UI 위젯을 초기화하기 전에 작업 메서드에서 애플리케이션은 다음 코드 조각에 표시된 대로 켜 ActionBar 기를 ActionBar.NavigationModeTabs 설정 NavigationMode 해야 합니다.

    ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
    SetContentView(Resource.Layout.Main);
    
  2. 를 사용하여 새 탭을 만듭니다 ActionBar.NewTab().

  3. 이벤트 처리기를 할당하거나 사용자가 ActionBar 탭과 상호 작용할 때 발생하는 이벤트에 응답하는 사용자 지정 ActionBar.ITabListener 구현을 제공합니다.

  4. 이전 단계에서 ActionBar만든 탭을 .에 추가합니다.

다음 코드는 다음 단계를 사용하여 이벤트 처리기를 사용하여 상태 변경에 응답하는 애플리케이션에 탭을 추가하는 예제입니다.

protected override void OnCreate(Bundle bundle)
{
    ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
    SetContentView(Resource.Layout.Main);

    ActionBar.Tab tab = ActionBar.NewTab();
    tab.SetText(Resources.GetString(Resource.String.tab1_text));
    tab.SetIcon(Resource.Drawable.tab1_icon);
    tab.TabSelected += (sender, args) => {
                           // Do something when tab is selected
                       };
    ActionBar.AddTab(tab);

    tab = ActionBar.NewTab();
    tab.SetText(Resources.GetString(Resource.String.tab2_text));
    tab.SetIcon(Resource.Drawable.tab2_icon);
    tab.TabSelected += (sender, args) => {
                           // Do something when tab is selected
                       };
    ActionBar.AddTab(tab);
}

이벤트 처리기 및 ActionBar.ITabListener

애플리케이션은 이벤트 처리기와 ActionBar.ITabListener 다양한 시나리오를 사용해야 합니다. 이벤트 처리기는 일정량의 구문 편의성을 제공합니다. 클래스를 만들고 구현 ActionBar.ITabListener할 필요가 없도록 합니다. 이러한 편리함은 비용이 듭니다. Xamarin.Android는 이 변환을 수행하여 하나의 클래스를 만들고 구현합니다 ActionBar.ITabListener . 애플리케이션의 탭 수가 제한되어 있으면 괜찮습니다.

많은 탭을 처리하거나 ActionBar 탭 간에 공통 기능을 공유하는 경우 메모리 및 성능 측면에서 구현하는 사용자 지정 클래스 ActionBar.ITabListener를 만들고 클래스의 단일 인스턴스를 공유하는 것이 더 효율적일 수 있습니다. 이렇게 하면 Xamarin.Android 애플리케이션에서 사용하는 GREF 수가 줄어듭니다.

이전 디바이스에 대한 이전 버전과의 호환성

Android 지원 라이브러리 v7 AppCompat은 ActionBar 탭을 Android 2.1(API 수준 7)에 다시 포트합니다. 이 구성 요소가 프로젝트에 추가되면 Xamarin.Android 애플리케이션에서 탭에 액세스할 수 있습니다.

ActionBar를 사용하려면 작업은 다음 코드 조각과 같이 AppCompat 테마를 서브클래스 ActionBarActivity 하고 사용해야 합니다.

[Activity(Label = "@string/app_name", Theme = "@style/Theme.AppCompat", MainLauncher = true, Icon = "@drawable/ic_launcher")]
public class MainActivity: ActionBarActivity

활동은 속성에서 해당 ActionBar에 대한 참조를 ActionBarActivity.SupportingActionBar 가져올 수 있습니다. 다음 코드 조각은 작업에서 ActionBar를 설정하는 예제를 보여 줍니다.

[Activity(Label = "@string/app_name", Theme = "@style/Theme.AppCompat", MainLauncher = true, Icon = "@drawable/ic_launcher")]
public class MainActivity : ActionBarActivity, ActionBar.ITabListener
{
    static readonly string Tag = "ActionBarTabsSupport";

    public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
    {
        // Optionally refresh/update the displayed tab.
        Log.Debug(Tag, "The tab {0} was re-selected.", tab.Text);
    }

    public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
    {
        // Display the fragment the user should see
        Log.Debug(Tag, "The tab {0} has been selected.", tab.Text);
    }

    public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
    {
        // Save any state in the displayed fragment.
        Log.Debug(Tag, "The tab {0} as been unselected.", tab.Text);
    }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SupportActionBar.NavigationMode = ActionBar.NavigationModeTabs;
        SetContentView(Resource.Layout.Main);
    }

    void AddTabToActionBar(int labelResourceId, int iconResourceId)
    {
        ActionBar.Tab tab = SupportActionBar.NewTab()
                                            .SetText(labelResourceId)
                                            .SetIcon(iconResourceId)
                                            .SetTabListener(this);
        SupportActionBar.AddTab(tab);
    }
}

요약

이 가이드에서는 ActionBar를 사용하여 Xamarin.Android에서 탭 사용자 인터페이스를 만드는 방법을 설명했습니다. ActionBar에 탭을 추가하는 방법과 활동이 인터페이스를 통해 ActionBar.ITabListener 탭 이벤트와 상호 작용하는 방법을 설명했습니다. 또한 Android 지원 라이브러리 v7 AppCompat 패키지가 ActionBar 탭을 이전 버전의 Android로 백포트하는 방법도 확인했습니다.