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;
}
Изображение в приведенном выше примере кода включается в качестве ресурса с приложением и копируется в общедоступное расположение при создании действия, поэтому он будет доступен другим приложениям, таким как приложение для обмена сообщениями. Пример кода, сопровождающий эту статью, содержит полный источник этого примера, иллюстрируя его использование.