VS 2015 开发Android底部导航条----[实例代码,多图]


1.废话背景介绍
在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中。
前面都是科普废话,上正文.
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底部导航条----[实例代码,多图]的更多相关文章
- Android开发关闭虚拟按钮、底部导航条
在Android开发中,遇到了一系列大大小小的问题,其中一个就是屏蔽底部实体键,我找了很多的博客也尝试了许许多多的方法,但始终不能屏蔽 HOME键,后来看见一篇博客说在Android 4.0以后,屏蔽 ...
- android开发(1):底部导航条的实现 | navigation tab | activity的创建
底部导航条,在iOS中叫tabbar,在android中叫bottombar或bottom navigation,是一个常用的切换页面的导航条. 同样,如果有良好的第三方库,我们应该优先考虑,能用好别 ...
- Android 修改TabLayout底部导航条Indicator的长短
关于Tablayout,使用的应该很频繁了,但是底部导航条长短是固定死的,需要自己来改动长短,找了半天没找着方法,看了下官方建议,可以通过映射来修改自己想要的长短,其实也就几行代码的问题,看代码: p ...
- Android底部导航栏——FrameLayout + RadioGroup
原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6285881.html Android底部导航栏有多种实现方式,本文详细介绍FrameLayout ...
- Android底部导航栏创建——ViewPager + RadioGroup
原创文章,引用请注明出处:http://www.cnblogs.com/baipengzhan/p/6270201.html Android底部导航栏有多种实现方式,本文详解其中的ViewPager ...
- Visual Studio 2015开发Android App问题集锦
Visual Studio 2015开发Android App 启动调试始终无法完成应用部署的解决方案 创建一个Android App项目后,直接启动调试发现Visual Studio Emulato ...
- Android底部导航栏
Android底部导航栏 今天简单写了一个底部导航栏,封装了一个库,用法比较简单 效果图 Github地址:https://github.com/kongqw/KqwBottomNavigation ...
- 15 Flutter BottomNavigationBar自定义底部导航条 以及实现页面切换 以及模块化
效果: /** * Flutter BottomNavigationBar 自定义底部导航条.以及实现页面切换: * BottomNavigationBar是底部导航条,可以让我们定义底部Tab ...
- BottomNavigationBar 自定义 底部导航条
在flutter中,BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数. BottomNav ...
随机推荐
- C++类初始化列表
转自:https://www.cnblogs.com/BlueTzar/articles/1223169.html 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟 ...
- jvm-知识点总结
参考: https://blog.csdn.net/wuqinghai2012/article/details/51485414 http://pengjiaheng.iteye.com/blog/5 ...
- 织梦DedeCMS实现 三级栏目_二级栏目_一级栏目_网站名称 的效果代码
1.将官方原来的排列方式反过来,找到include/typelink.class.php第164行 $this->valuePositionName = $tinfos['typename']. ...
- [转载]织梦DEDE多选项筛选_联动筛选功能的实现_二次开发
织梦默认的列表页没有筛选功能,但有时候我们做产品列表页的时候,产品的字段比较多,很多人都需要用到筛选功能,这样可以让用户更方便的找到自己所需要的东西,实现这个联动筛选功能需要对织梦进行二次开发,下面就 ...
- @RequestMapping映射请求,@PathVariable,@RequestParam,@RequestHeader的使用
1.@RequestMapping Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求,在控制器的类定义及方法定义处都可标注. @RequestMa ...
- Oracle常见的几种登录方式
1.运行SQLPLUS工具 C:\Users\csb>sqlplus(回车) (输入账户)system(回车) (输入密码) (回车) 2.直接进入SQLPLUS命令提示符,无用户的登陆 C:\ ...
- MyEclipse中删除对Struts、Hibernate、Spring .
已经导入一下框架,现在发现不想用了,要删除,发现麻烦,添加容易删除不易,下面这个帮你解决删除问题,本文为转载,我试过hibenate,挺好使,你们验证其他的框架 http://blog.csdn.ne ...
- Java中foreach用法,增强型的for循环的样例和解释
JDK1.5加入的增强for和循环. 这段时间又回顾了一下JAVA基础 foreach语句使用总结 增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集 ...
- HIVE- SCD缓慢变化
SCD缓慢变化维,比如一个用户维表,用户属性会变化,但是不会变化很剧烈,可能一年只会变化一两次,也不会所有用户的属性都会有变化,只有少量的数据发生变化,所以叫缓慢变化维.这种问题就是由于维度的变化所造 ...
- springmvc学习(2)
SpringMvc是最主流的MVC框架之一. Spring3.0后全面超越Struts2,成为最优先的MVC框架 SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何借 ...