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. 20145109《Java程序设计》第一周学习总结

    20145109 <Java程序设计>第一周学习总结 教材学习内容总结 About JVM, JRE, JDK JVM包含于JRE中,用于运行Java程序.JDK用于开发Java程序,包含 ...

  2. 使用Kali Linux 破解无线网

    用到的工具 airmon-ngairodump-ngaireplay-ngaircrack-ng 过程 123456789101112131415161718192021222324 root@lm: ...

  3. shell编程学习笔记--整数自增

    在Shell脚本中,用于while或for循环中经常要涉及到整数自增的情况,下面罗列下可能的方式 [方式一]declare -i来声明整数变量 root@localhost:~# declare -i ...

  4. python random使用生成随机字符串

    应用python random标准库做一个随机生成密码的程序,可以随机生成任意多个字符.(基于python2.7,如果是python3需要修改下) 案例: #-*-coding:utf-8 -*-#a ...

  5. Appium 自动化测试(4)-- 脚本开发:官方demo演示 android_contacts.py

    前提:根据前面的环境搭建介绍,安装好相关环境 step1:启动android模拟器 step2:启动Appium服务端 step3:演示代码执行 这里执行的是官方的演示代码:通讯录管理app,安装打开 ...

  6. IOS-支付宝

      一.使用支付宝进行一个完整的支付功能,大致有以下步骤: 与支付宝签约,获得商户ID(partner)和账号ID(seller) 下载相应的公钥私钥文件(加密签名用) 下载支付宝SDK 生成订单信息 ...

  7. iptables(四)iptables匹配条件总结之一

    经过前文的总结,我们已经能够熟练的管理规则了,但是我们使用过的"匹配条件"少得可怜,之前的示例中,我们只使用过一种匹配条件,就是将"源地址"作为匹配条件. 那么 ...

  8. [转载]Java动态生成word文档(图文并茂)

    很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...

  9. 【2018年全国多校算法寒假训练营练习比赛(第四场)-D】小明的挖矿之旅

    题目链接:https://www.nowcoder.com/acm/contest/76/D 做题时没注意到“无论出现在哪个格子”..题中也没说明一个格子只能经过一次,其实没有想象的复杂. 判断如果点 ...

  10. docker 创建镜像,并推送到私有仓库

    创建镜像 创建  Dockerfile 镜像命名规则:registyr_url / namespace / depart / name : version 用这个规则创建的镜像,可直接推送到私有仓库 ...