Xamarin.Android ActionBar(その2 タブ)
1 タブモード

ActionBarのNavigationModeを「ActionBarNavigationMode.Tabs」にセットすることで、タブの追加が可能になります。
[Activity(Label = "AndroidApplication3", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity, ActionBar.ITabListener{ protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;//タブ表示モード SetContentView(Resource.Layout.Main); var tab = ActionBar.NewTab();//タブの生成 tab.SetText("Tab1");//テキストの設定 tab.SetIcon(Android.Resource.Drawable.IcMenuEdit);//アイコンの設定 tab.SetTabListener(this); //リスナーを自分自身に設定する ActionBar.AddTab(tab);//タブの追加 tab = ActionBar.NewTab(); tab.SetText("Tab2"); tab.SetIcon(Android.Resource.Drawable.IcMenuDelete); tab.SetTabListener(this); ActionBar.AddTab(tab); tab = ActionBar.NewTab(); tab.SetText("Tab3"); tab.SetIcon(Android.Resource.Drawable.IcMenuCall); tab.SetTabListener(this); ActionBar.AddTab(tab);
※最初のActionBar.AddTabで(1つ目のタブが選択状態になり)OnTabSelectedが呼ばれます。この時点で、このイベントが処理されていないと例外となって死んでしまいます。ちょっと嵌りました。
//嵌りどころ var tab = ActionBar.NewTab(); tab.SetText("Tab1"); //tab.TabSelected += (s, a) => { }; この行が無いと・・・ ActionBar.AddTab(tab); // ここで例外発生
2 タブのみ表示

次の2行で、アクションバー非表示でタブのみの表示になります。
//アクションバーを消して、タブのみ表示する ActionBar.SetDisplayShowTitleEnabled(false); ActionBar.SetDisplayShowHomeEnabled(false);
3 表示幅を超えた場合の表示
タブの数が多くって横幅を超えた場合、縦表示時でタブはスクロールするようになり、横表示時には折りたたまれます。
4 イベント
タブは、選択、選択解除、再選択(既に選択されているものを再度選択)の3つのイベントを処理できます。
イベントは個別に処理することも可能ですが、タブが多くなって来た場合は、サンプルのようにActionBar.ITabListenerを継承してリスナーを設定するほうがスッキリするように感じました。
public class MainActivity : Activity, ActionBar.ITabListener{ public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { //選択中のタブが再び選択された時の処理 } public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { //タブが選択された時の処理 Toast.MakeText(this, tab.Text, ToastLength.Short).Show(); } public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { //タブの選択が解除された時の処理 } }
5 タブの選択・削除
下記のコードでタブの選択や解除が可能です。
ActionBar.SelectTab(tab3); //タブを選択 ActionBar.RemoveTabAt(0); //0番目のタブを削除 ActionBar.RemoveTab(tab2); //tab2を削除 ActionBar.RemoveAllTabs(); //すべてのタブを削除