原文:Xamarin.Android开发实践(九)html
现在不少应用都会使用碎片以便在同一个活动中可以显示多个不一样的视图。在 Android 3.0 以上的版本中,咱们已经可使用ActionBar提供的Tab来实现这种效果,而不须要咱们本身去实现碎片的切换。ActionBar默认是不具有选项 卡功能的,因此咱们须要给一个属性赋上对应的枚举,好比下面的方式将开启选项卡。java
1 ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
开启以后,咱们就须要往ActionBar中添加Tab,固然这里咱们不能直接new一个Tab而须要使用ActionBar的AddTab方法建立,而后设置对应的属性,好比下面的方式将建立两个选项卡。android
1 var tab = ActionBar.NewTab(); 2 tab.SetText("Tab1"); 3 tab.SetIcon(Resource.Drawable.Icon); 4 var tab2 = ActionBar.NewTab(); 5 tab2.SetText("Tab2"); 6 tab2.SetIcon(Resource.Drawable.Icon);
咱们利用选项卡的SetText设置选项卡的文本,经过SetIcon设置选项的图片,好比下面这张图。ide
咱们只是实现了添加两个选项卡,可是点击以后是没有任何效果的。因此咱们还须要建立两个碎片,以便在点击不一样的选项卡后可以切换。首先咱们在Resources/layout下分别新建Fragment1.axml和Fragment2.axml,其中的内容读者能够自行设置,只要最后可以区分的出来便可。post
有了这些碎片,下面咱们就能够监听选项卡的点击事件,从而切换不一样的选项卡。首先咱们须要将咱们须要使用的碎片实例化。学习
1 fragment1 = new Fragment1(); 2 fragment2 = new Fragment2();
而后监听tab的事件。测试
1 tab.TabSelected += (s, e) =>
2 { 3 if (!fragment1.IsAdded) 4 { 5 e.FragmentTransaction.Add(Resource.Id.frameLayout1, fragment1); 6 } 7 if (fragment2.IsAdded && !fragment2.IsHidden) 8 { 9 e.FragmentTransaction.Hide(fragment2); 10 } 11 e.FragmentTransaction.Show(fragment1); 12 };
由于笔者本来从事过java下的android开发,因此这里仍是沿用了java下的方式,首先是判断fragment1是否添加进去了,若是没有则添加,而后又判断了fragment2是否添加,而且是否已经显示,若是显示则隐藏。最后才显示fragment1。同理tab2的方式也是同样的,只是fragment1与fragment2互调。最后经过ActionBar的AddTab添加选项卡,这样作尚未结束,咱们还要默认选项第一个选项卡,这里须要经过ActionBar的SelectTab方法设置。下面是活动中的全部代码。this
1 [Activity(Label = "ActionBarStudy", MainLauncher = true, Icon = "@drawable/icon")] 2 public class MainActivity : Activity 3 { 4 Fragment fragment1; 5 Fragment fragment2; 6 7 protected override void OnCreate(Bundle bundle) 8 { 9 base.OnCreate(bundle); 10 SetContentView(Resource.Layout.Main); 11 ActionBar.NavigationMode = ActionBarNavigationMode.Tabs; 12 13 fragment1 = new Fragment1(); 14 fragment2 = new Fragment2(); 15 16 var tab = ActionBar.NewTab(); 17 tab.SetText("Tab1"); 18 tab.SetIcon(Resource.Drawable.Icon); 19 var tab2 = ActionBar.NewTab(); 20 tab2.SetText("Tab2"); 21 tab2.SetIcon(Resource.Drawable.Icon); 22 23 tab.TabSelected += (s, e) => 24 { 25 if (!fragment1.IsAdded) 26 { 27 e.FragmentTransaction.Add(Resource.Id.frameLayout1, fragment1); 28 } 29 if (fragment2.IsAdded && !fragment2.IsHidden) 30 { 31 e.FragmentTransaction.Hide(fragment2); 32 } 33 e.FragmentTransaction.Show(fragment1); 34 }; 35 36 37 38 tab2.TabSelected += (s, e) => 39 { 40 if (!fragment2.IsAdded) 41 { 42 e.FragmentTransaction.Add(Resource.Id.frameLayout1, fragment2); 43 } 44 if (fragment1.IsAdded && !fragment1.IsHidden) 45 { 46 e.FragmentTransaction.Hide(fragment1); 47 } 48 e.FragmentTransaction.Show(fragment2); 49 }; 50 51 ActionBar.AddTab(tab); 52 ActionBar.AddTab(tab2); 53 54 ActionBar.SelectTab(tab); 55 } 56 }
最后是实际的运行结果图。url
选择TAB2后的结果。spa
说道菜单咱们能够看下下面的图片。
其中右上角和底部都属于菜单,而下面的内容咱们将学习如何建立这些菜单,而且响应 这些菜单。首先咱们先建立最简单的菜单,就是上图中底部的菜单。可是菜单的建立跟上节的选项卡建立的方式是不同的,不能随便在任何地方添加,咱们必须重 写特定的方法,经过这个方法提供的参数建立菜单,而这个方法就是OnCreateOptionsMenu,其中有一个名为menu的参数,而咱们就须要经过这个参数去建立菜单,下面咱们建立一个简单的菜单。
1 public override bool OnCreateOptionsMenu(IMenu menu) 2 { 3 var m1 = menu.Add(0, 1, 0, "测试1"); 4 return base.OnCreateOptionsMenu(menu); 5 }
咱们须要经过add方法添加菜单,而它的第一个参数是用来分组的,而第二个是菜单的id,主要是后面用来响应菜单的点击,第三个是菜单的位置,最后就是菜单的名称了。运行上面的程序咱们将能够看到以下所示的结果。
可是咱们点击这个菜单并不会发生什么,由于咱们尚未对这个菜单进行响应。跟建立菜单同样,响应菜单也须要经过重写一个方法实现,这样咱们就须要经过判断的菜单的id来区分哪一个菜单被点击了,好比下面咱们将响应上面的菜单并弹出提示。
1 public override bool OnOptionsItemSelected(IMenuItem item) 2 { 3 switch (item.ItemId) 4 { 5 case 1: 6 { 7 Toast.MakeText(this, "测试1被按下", ToastLength.Short).Show(); 8 } 9 break; 10 } 11 return base.OnOptionsItemSelected(item); 12 }
菜单的id最终是存放在ItemId属性中的,因此咱们就须要switch这个属性。下面咱们点击这个菜单就可以看到提示信息了。若是你想将这个菜单设置到ActionBar的右边其实很简单,只要经过SetShowAsActionFlags便可,好比下面的代码将把菜单设置到ActionBar的右。
1 public override bool OnCreateOptionsMenu(IMenu menu) 2 { 3 var m1 = menu.Add(0, 1, 0, "测试1"); 4 m1.SetShowAsActionFlags(ShowAsAction.IfRoom | ShowAsAction.WithText); 5 return base.OnCreateOptionsMenu(menu); 6 }
接着咱们就能够看到以下的结果了。
固然对应的事件并不会消失,最后咱们须要设置一个图片,这个就更简单了,相信不少人均可以猜出,就是经过SetIcon方法。
1 public override bool OnCreateOptionsMenu(IMenu menu) 2 { 3 var m1 = menu.Add(0, 1, 0, "测试1"); 4 m1.SetShowAsActionFlags(ShowAsAction.IfRoom | ShowAsAction.WithText); 5 m1.SetIcon(Resource.Drawable.Icon); 6 return base.OnCreateOptionsMenu(menu); 7 }
最后咱们回到以前所说的分组,到底可以干什么用,他可让咱们呈现出单选、多选形式的菜单。主要是经过SetGroupCheckable方法设置,好比下面的方法将呈现单选形式。
1 public override bool OnCreateOptionsMenu(IMenu menu) 2 { 3 var m1 = menu.Add(0, 1, 0, "测试1"); 4 var m2 = menu.Add(0, 2, 0, "测试2"); 5 var m3 = menu.Add(0, 3, 0, "测试3"); 6 7 menu.SetGroupCheckable(0, true, true); 8 return base.OnCreateOptionsMenu(menu); 9 }
如图。
若是咱们将SetGroupCheckable方法的最后一个参数设置为false将会变为多选形式。
最后就是子菜单,最终的效果就是咱们点击一个菜单后将会以弹窗的方式呈现它的子菜单,这里咱们只须要将Add改为AddSubMenu便可建立子菜单。
1 public override bool OnCreateOptionsMenu(IMenu menu) 2 { 3 var m1 = menu.AddSubMenu("子菜单"); 4 m1.AddSubMenu("子菜单1"); 5 m1.AddSubMenu("子菜单2"); 6 return base.OnCreateOptionsMenu(menu); 7 }
而后咱们点击子菜单将会出现以下结果。