1.废话背景介绍 

在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中。

  这也就是说,Xamarin将免费提供给所有购买了Visual Studio的开发者使用。这样一来,开发者就能利用 .NET和C#工具,开发Android和iOS应用程序了。
  重要的是,Xamarin与Visual Studio的整合没有任何限制。尽管未被收购前,Xamarin也提供免费版给开发者使用,但该免费版只支持小型可执行程序。想要在Xamarin上开发大型可执行程序的话,开发者还是得先花钱买授权。
  但现在情况不同了,开发者除了无法自由使用Xamarin部分面向企业客户的功能,其它所有工具都可免费使用。
  重要的是,现在Xamarin Studio还支持在OS X平台上使用。
  此外微软表示,几周后将完全开放Xamarin SDK。这意味着Xamarin的运行环境、库文件界面和编码工具,将被公布在Github上,由 .NET Foundation进行管理。与此同时,供开发者构建用户界面的跨平台工具包Xamarin Forms也将开源。
 

前面都是科普废话,上正文.

2.环境安装 

抱着试一试的心态,更新了VS 2015 Updata2, 因为以前就玩过Xamarin,注册了帐号发现升级后还是使用过去,很郁闷 以为微软忽悠我们呢.

试着找找 无意中在Tools --> Options  --> Other 里面看到 Xamarin for Visual Studio Updatas

咦这是什么鬼?

点击 Check Now 试试 如图:

 

等到一段时间, 墙的威力太大,有必要的话请FQ更新.另外Android SDK NDK的安装(什么,你知道怎么安装,请baidu一下)也请FQ,下载镜像可以设置为东软的镜像 mirrors.neusoft.edu.cn

如图:

这些下载更新快多了.

环境这些准备好了.

我们来回归正题.

3.Android底部导航条

终于可以写代码了,开始不了解Xamarin Android的原理,还导出找教程,尼玛最后才知道不管Android还是IOS Xamarin都可以直接使用原生的界面布局加C#语法编译打包.这下简单了找个原生的例子直接使用,略加翻译Java-->C#即可,Java C#相似度极高. 聪明的你们肯定一看就会.以下实例本人均翻译至Java的实例.

简单说说原理,主要使用TabActivity TabHost Intent. 你问我他们分别是干什么的? 呃!~~~ 这个可以将一本书了, 用了你就知道了.

现在 TabActivity据说已经过时 Fragment已取代了他.有兴趣的朋友可以试试,找个例子改改.

TabActivity在API 13(Android 3.2)被标记为过期,需要使用Fragment来实现,Fragment是Android 3.0引入的一个概念,主要就是为了适应各种不同的屏

先上张效果图,这是最终要实现的样子:

开始建工程

这个大家都会吧,不多说.

创建Maintabs.axml


xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0.0dip"
            android:layout_weight="1.0" />
        <TabWidget
            android:id="@android:id/tabs"
            android:visibility="gone"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.0" />
        <RadioGroup
            android:gravity="center_vertical"
            android:layout_gravity="bottom"
            android:orientation="horizontal"
            android:id="@+id/main_radio"
            android:background="@drawable/maintab_toolbar_bg"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <RadioButton
                android:id="@+id/radio_button0"
                android:layout_marginTop="2.0dip"
                android:text="@string/main_home"
                android:drawableTop="@drawable/icon_1_n"
                style="@style/main_tab_bottom" />
            <RadioButton
                android:id="@+id/radio_button1"
                android:layout_marginTop="2.0dip"
                android:text="@string/main_news"
                android:drawableTop="@drawable/icon_2_n"
                style="@style/main_tab_bottom" />
            <RadioButton
                android:id="@+id/radio_button2"
                android:layout_marginTop="2.0dip"
                android:text="@string/main_manage_date"
                android:drawableTop="@drawable/icon_3_n"
                style="@style/main_tab_bottom" />
            <RadioButton
                android:id="@+id/radio_button3"
                android:layout_marginTop="2.0dip"
                android:text="@string/main_friends"
                android:drawableTop="@drawable/icon_4_n"
                style="@style/main_tab_bottom" />
            <RadioButton
                android:id="@+id/radio_button4"
                android:layout_marginTop="2.0dip"
                android:text="@string/more"
                android:drawableTop="@drawable/icon_5_n"
                style="@style/main_tab_bottom" />
        RadioGroup>
    LinearLayout>

TabHost>

修改 MainActivity.cs


 1 using System;
 2 using Android.App;
 3 using Android.Content;
 4 using Android.Runtime;
 5 using Android.Views;
 6 using Android.Widget;
 7 using Android.OS;
 8 
 9 namespace MyAppTest
 {
     [Activity(Label = "MyAppTest", MainLauncher = true, Icon = "@drawable/icon",Theme = "@android:style/Theme.DeviceDefault.NoActionBar")]
     public class MainTabActivity : TabActivity, CompoundButton.IOnCheckedChangeListener
     {
         private TabHost mTabHost;
         private Intent mAIntent;
         private Intent mBIntent;
         private Intent mCIntent;
         private Intent mDIntent;
         private Intent mEIntent;
         
         protected override void OnCreate(Bundle bundle)
         {
             base.OnCreate(bundle);
             RequestWindowFeature(WindowFeatures.NoTitle);
             // Set our view from the "main" layout resource
             SetContentView(Resource.Layout.Maintabs);
 
             this.mAIntent = new Intent(this, typeof (AActivity));
             this.mBIntent = new Intent(this, typeof (BActivity));
             this.mCIntent = new Intent(this, typeof (CActivity));
             this.mDIntent = new Intent(this, typeof (DActivity));
             this.mEIntent = new Intent(this, typeof (EActivity));
 
             ((RadioButton)FindViewById(Resource.Id.radio_button0)).SetOnCheckedChangeListener(this);
             ((RadioButton)FindViewById(Resource.Id.radio_button1)).SetOnCheckedChangeListener(this);
             ((RadioButton)FindViewById(Resource.Id.radio_button2)).SetOnCheckedChangeListener(this);
             ((RadioButton)FindViewById(Resource.Id.radio_button3)).SetOnCheckedChangeListener(this);
             ((RadioButton)FindViewById(Resource.Id.radio_button4)).SetOnCheckedChangeListener(this);
 
 
             SetupIntent();
         }
 
         public void OnCheckedChanged(CompoundButton buttonView, bool isChecked)
         {
             if (isChecked)
             {
                 switch (buttonView.Id)
                 {
                     case Resource.Id.radio_button0:
                         this.mTabHost.SetCurrentTabByTag("A_TAB");
                         break;
                     case Resource.Id.radio_button1:
                         this.mTabHost.SetCurrentTabByTag("B_TAB");
                         break;
                     case Resource.Id.radio_button2:
                         this.mTabHost.SetCurrentTabByTag("C_TAB");
                         break;
                     case Resource.Id.radio_button3:
                         this.mTabHost.SetCurrentTabByTag("D_TAB");
                         break;
                     case Resource.Id.radio_button4:
                         this.mTabHost.SetCurrentTabByTag("MORE_TAB");
                         break;
                 }
             }
         }
 
         private void SetupIntent()
         {
             this.mTabHost = this.TabHost;
             TabHost localTabHost = this.mTabHost;
 
             localTabHost.AddTab(BuildTabSpec("A_TAB", Resource.String.main_home,Resource.Drawable.icon_1_n, this.mAIntent));
 
             localTabHost.AddTab(BuildTabSpec("B_TAB", Resource.String.main_news,
                 Resource.Drawable.icon_2_n, this.mBIntent));
 
             localTabHost.AddTab(BuildTabSpec("C_TAB",
                 Resource.String.main_manage_date, Resource.Drawable.icon_3_n,
                 this.mCIntent));
 
             localTabHost.AddTab(BuildTabSpec("D_TAB", Resource.String.main_friends,
                 Resource.Drawable.icon_4_n, this.mDIntent));
 
             localTabHost.AddTab(BuildTabSpec("MORE_TAB", Resource.String.more,
                 Resource.Drawable.icon_5_n, this.mEIntent));
 
         }
 
         private TabHost.TabSpec BuildTabSpec(string tag, int resLabel, int resIcon, Intent content)
         {
             return this.mTabHost.NewTabSpec(tag).SetIndicator(GetString(resLabel),
                 Resources.GetDrawable(resIcon)).SetContent(content);
         }
     }

97 }

注意红色部分,与自动创建的不同.

创建其他 Activity.cs / AActivity BActivity CActivity DActivity EActivity

using System;


using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS; namespace MyAppTest
{
    [Activity(Label = "AActivity", Icon = "@drawable/icon", Theme = "@android:style/Theme.DeviceDefault.NoActionBar")]
    public class AActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            RequestWindowFeature(WindowFeatures.NoTitle);             TextView tv = new TextView(this);
            tv.SetText("This is A Activity!", TextView.BufferType.Normal);
            tv.Gravity = GravityFlags.Center;
            SetContentView(tv);
        }
    }
}

涉及到的资源这里没有列出,请参考源码.

 4.真机调试

代码写完了,该编译以下了, 看看是否有错, 编译顺利通过, 插上真机(我这里有个买车险送的 200块的 Android平板 准备扔了的,试了下很真可以调试程序),

要VS直接调试的话,需要VS是以管理员方式启动的, 查上设备后你会看到:

设备显示在调试的位置,直接F5就可以了. 什么?无图无真相?

运行效果:

5.打包 

调试完了,该打包发布了是吧?

等等 打包(Export Android Package(.apk))怎么是灰色的?

别着急,大微软肯定不会忽悠你.

原来你需要把编译 模式选择为 Release,默认的Debug是不能打包的. 看这里. 看这里.

打包完成:

你问我卡不卡呀? 我这不到200块钱的白送的pad都可以流畅的跑.

结束了,该上码了:

本文源码下载:

http://files.cnblogs.com/files/crazybird/MyAppTest.zip

出处:http://www.cnblogs.com/crazybird/articles/5373223.html

VS 2015 开发Android底部导航条----[实例代码,多图]的更多相关文章

  1. Android开发关闭虚拟按钮、底部导航条

    在Android开发中,遇到了一系列大大小小的问题,其中一个就是屏蔽底部实体键,我找了很多的博客也尝试了许许多多的方法,但始终不能屏蔽 HOME键,后来看见一篇博客说在Android 4.0以后,屏蔽 ...

  2. android开发(1):底部导航条的实现 | navigation tab | activity的创建

    底部导航条,在iOS中叫tabbar,在android中叫bottombar或bottom navigation,是一个常用的切换页面的导航条. 同样,如果有良好的第三方库,我们应该优先考虑,能用好别 ...

  3. Android 修改TabLayout底部导航条Indicator的长短

    关于Tablayout,使用的应该很频繁了,但是底部导航条长短是固定死的,需要自己来改动长短,找了半天没找着方法,看了下官方建议,可以通过映射来修改自己想要的长短,其实也就几行代码的问题,看代码: p ...

  4. Android底部导航栏——FrameLayout + RadioGroup

    原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6285881.html Android底部导航栏有多种实现方式,本文详细介绍FrameLayout ...

  5. Android底部导航栏创建——ViewPager + RadioGroup

    原创文章,引用请注明出处:http://www.cnblogs.com/baipengzhan/p/6270201.html Android底部导航栏有多种实现方式,本文详解其中的ViewPager ...

  6. Visual Studio 2015开发Android App问题集锦

    Visual Studio 2015开发Android App 启动调试始终无法完成应用部署的解决方案 创建一个Android App项目后,直接启动调试发现Visual Studio Emulato ...

  7. Android底部导航栏

    Android底部导航栏 今天简单写了一个底部导航栏,封装了一个库,用法比较简单 效果图 Github地址:https://github.com/kongqw/KqwBottomNavigation ...

  8. 15 Flutter BottomNavigationBar自定义底部导航条 以及实现页面切换 以及模块化

    效果: /**  * Flutter  BottomNavigationBar 自定义底部导航条.以及实现页面切换:  * BottomNavigationBar是底部导航条,可以让我们定义底部Tab ...

  9. BottomNavigationBar 自定义 底部导航条

    在flutter中,BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数. BottomNav ...

随机推荐

  1. sql server 数据库复制实现数据同步常见问题(不定期更新)

    sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...

  2. powerdesigner 左边的列表框弄不见了怎么弄出来

    快捷键  Alt + 0(数字零)  或者点击下面图片的 红色标识位置.就出来了.

  3. Windows7中pagefil.sys和Hiberfil.sys文件删除与转移

    第一步.在开始的功能表的搜索栏里输入 cmd,然后在搜索结果中的 cmd 按下右键,点选[以系统管理员身分运行] 第二步.在命令提示符窗口里输入下面命令然后按下Enter: powercfg –h o ...

  4. infa dos命令

    informatica8.6用dos命令执行作业的命令: pmcmd startworkflow -sv integration -d Domain_BlueBreezeq -u Administra ...

  5. Scala学习手记1 - 快速体验

    又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...

  6. Netty(RPC高性能之道)原理剖析

    1,Netty简述 Netty 是一个基于 JAVA NIO 类库的异步通信框架,用于创建异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性的网络客户端和服务器端 RPC高性能分析,请参考文章“[ ...

  7. JSON/JSONP浅谈

    一.什么是JSON? JSON 即 JavaScript Object Notation 的缩写,简而言之就是JS对象的表示方法,是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法,类 ...

  8. java中的几种实体类对象(PO,VO,DAO,BO,POJO)

    一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 二.VO :(value object) ...

  9. saltstack技术入门与实践

    基本原理 SaltStack 采用`C/S`模式,server端就是salt的master,client端就是minion,minion与master之间通过`ZeroMQ`消息队列通信. minio ...

  10. win8 商店应用 概观

    外观: 1,适应性好.可以在各种外形规格和显示大小上正确的展示数据. 2,磁贴. 交互方式: 1,应用栏.使用应用栏可以向用户显示命令和工具.默认情况下,应用栏会被隐藏,当用户使用手指从屏幕的底部边缘 ...