ActionBar для Xamarin.Android

При использовании TabActivityкод для создания значков вкладок не действует при запуске на платформе Android 4.0. Хотя он работает так же, как и в версиях Android до 2.3, TabActivity сам класс был нерекомендуем в версии 4.0. Был представлен новый способ создания интерфейса с вкладками, использующего панель действий, которую мы обсудим далее.

Вкладки панели действий

Панель действий включает поддержку добавления интерфейсов табуляции в Android 4.0. На следующем снимка экрана показан пример такого интерфейса.

Screenshot of app running in an emulator; two tabs are shown

Чтобы создать вкладки на панели действий, сначала необходимо задать его NavigationMode свойство для поддержки вкладок. В Android 4 ActionBar свойство доступно в классе Activity, который можно использовать для задания следующего NavigationMode :

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

После этого можно создать вкладку, вызвав NewTab метод на панели действий. С помощью этого экземпляра вкладки можно вызвать SetText методы, SetIcon чтобы задать текст и значок метки вкладки. Эти вызовы выполняются в следующем коде:

var tab = this.ActionBar.NewTab ();
tab.SetText (tabText);
tab.SetIcon (Resource.Drawable.ic_tab_white);

Прежде чем добавить вкладку, нам нужно обработать TabSelected событие. В этом обработчике можно создать содержимое для вкладки. Вкладки панели действий предназначены для работы с фрагментами, которые представляют часть пользовательского интерфейса в действии. В этом примере представление фрагмента содержит один, TextViewкоторый мы раздуем в нашем Fragment подклассе следующим образом:

class SampleTabFragment: Fragment
{           
    public override View OnCreateView (LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView (inflater, container, savedInstanceState);

        var view = inflater.Inflate (
            Resource.Layout.Tab, container, false);

        var sampleTextView =
            view.FindViewById<TextView> (Resource.Id.sampleTextView);            
        sampleTextView.Text = "sample fragment text";

        return view;
    }
}

Аргумент события, переданный в TabSelected событии, имеет тип TabEventArgs, который включает FragmentTransaction свойство, которое можно использовать для добавления фрагмента, как показано ниже:

tab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e) {             
    e.FragmentTransaction.Add (Resource.Id.fragmentContainer,
        new SampleTabFragment ());
};

Наконец, можно добавить вкладку в панель действий, вызвав AddTab метод, как показано в этом коде:

this.ActionBar.AddTab (tab);

Полный пример см . в проекте HelloTabsICS в примере кода для этого документа.

ShareActionProvider

Класс ShareActionProvider позволяет выполнять действие общего доступа из панели действий. Он заботится о создании представления действий со списком приложений, которые могут обрабатывать намерение общего доступа и сохраняет историю ранее используемых приложений для простого доступа к ним позже из панели действий. Это позволяет приложениям совместно использовать данные с помощью пользовательского интерфейса, согласованного на всей платформе Android.

Пример общего доступа к изображениям

Например, ниже приведен снимок экрана панели действий с элементом меню для совместного использования изображения (взятого из примера ShareActionProvider ). Когда пользователь нажимает элемент меню на панели действий, ShareActionProvider загружает приложение для обработки намерения, связанного с ним ShareActionProvider. В этом примере приложение обмена сообщениями использовалось ранее, поэтому оно представлено на панели действий.

Screenshot of messaging application icon in the Action Bar

Когда пользователь щелкает элемент на панели действий, запускается приложение для обмена сообщениями, содержащее общий образ, как показано ниже:

Screenshot of messaging app displaying monkey image

Указание класса поставщика действий

Чтобы использовать ShareActionProviderатрибут в элементе меню XML для меню панели действий, задайте android:actionProviderClass атрибут в следующем формате:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/shareMenuItem"
      android:showAsAction="always"
      android:title="@string/sharePicture"
      android:actionProviderClass="android.widget.ShareActionProvider" />
</menu>

Раздувание меню

Чтобы раздуть меню, мы переопределяем OnCreateOptionsMenu подкласс действия. После получения ссылки на меню можно получить ShareActionProvider из ActionProvider свойства элемента меню, а затем использовать метод SetShareIntent для задания ShareActionProviderнамерения, как показано ниже:

public override bool OnCreateOptionsMenu (IMenu menu)
{
    MenuInflater.Inflate (Resource.Menu.ActionBarMenu, menu);       

    var shareMenuItem = menu.FindItem (Resource.Id.shareMenuItem);           
    var shareActionProvider =
       (ShareActionProvider)shareMenuItem.ActionProvider;
    shareActionProvider.SetShareIntent (CreateIntent ());
}

Создание намерения

Для ShareActionProvider запуска соответствующего действия будет использоваться намерение, переданное SetShareIntent методу в приведенном выше коде. В этом случае мы создадим намерение для отправки изображения с помощью следующего кода:

Intent CreateIntent ()
{  
    var sendPictureIntent = new Intent (Intent.ActionSend);
    sendPictureIntent.SetType ("image/*");
    var uri = Android.Net.Uri.FromFile (GetFileStreamPath ("monkey.png"));          
    sendPictureIntent.PutExtra (Intent.ExtraStream, uri);
    return sendPictureIntent;
}

Изображение в приведенном выше примере кода включается в качестве ресурса с приложением и копируется в общедоступное расположение при создании действия, поэтому он будет доступен другим приложениям, таким как приложение для обмена сообщениями. Пример кода, сопровождающий эту статью, содержит полный источник этого примера, иллюстрируя его использование.