Поделиться через


ActionBar для Xamarin.Android

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

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

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

Снимок экрана: приложение, работающее в эмуляторе; Показаны две вкладки

Чтобы создать вкладки на панели действий, сначала необходимо задать его 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атрибут в элементе меню 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;
}

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