VS 2015 開發Android底部導航條----[實例代碼,多圖]

 

 

 

 

 

 

1.廢話背景介紹 html

在Build 2016開發者大會上,微軟宣佈,Xamarin將被整合進全部版本的Visual Studio之中。android

 

  這也就是說,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也將開源。
 

前面都是科普廢話,上正文.ide

 

2.環境安裝 工具

抱着試一試的心態,更新了VS 2015 Updata2, 由於之前就玩過Xamarin,註冊了賬號發現升級後仍是使用過去,很鬱悶 覺得微軟忽悠咱們呢.佈局

 

試着找找 無心中在Tools --> Options  --> Other 裏面看到 Xamarin for Visual Studio Updataspost

咦這是什麼鬼?ui

  

點擊 Check Now 試試 如圖:this

 

 

 

等到一段時間, 牆的威力太大,有必要的話請FQ更新.另外Android SDK NDK的安裝(什麼,你知道怎麼安裝,請baidu一下)也請FQ,下載鏡像能夠設置爲東軟的鏡像 mirrors.neusoft.edu.cn編碼

如圖:spa

 

 

 這些下載更新快多了.

 

環境這些準備好了.

 

咱們來回歸正題. 

 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
10 {
11     [Activity(Label = "MyAppTest", MainLauncher = true, Icon = "@drawable/icon",Theme = "@android:style/Theme.DeviceDefault.NoActionBar")]
12     public class MainTabActivity :  TabActivity, CompoundButton.IOnCheckedChangeListener
13     {
14         private TabHost mTabHost;
15         private Intent mAIntent;
16         private Intent mBIntent;
17         private Intent mCIntent;
18         private Intent mDIntent;
19         private Intent mEIntent;
20         
21         protected override void OnCreate(Bundle bundle)
22         {
23             base.OnCreate(bundle);
24             RequestWindowFeature(WindowFeatures.NoTitle);
25             // Set our view from the "main" layout resource
26             SetContentView(Resource.Layout. Maintabs);
27 
28             this.mAIntent = new Intent(this, typeof (AActivity));
29             this.mBIntent = new Intent(this, typeof (BActivity));
30             this.mCIntent = new Intent(this, typeof (CActivity));
31             this.mDIntent = new Intent(this, typeof (DActivity));
32             this.mEIntent = new Intent(this, typeof (EActivity));
33 
34             ((RadioButton)FindViewById(Resource.Id.radio_button0)).SetOnCheckedChangeListener(this);
35             ((RadioButton)FindViewById(Resource.Id.radio_button1)).SetOnCheckedChangeListener(this);
36             ((RadioButton)FindViewById(Resource.Id.radio_button2)).SetOnCheckedChangeListener(this);
37             ((RadioButton)FindViewById(Resource.Id.radio_button3)).SetOnCheckedChangeListener(this);
38             ((RadioButton)FindViewById(Resource.Id.radio_button4)).SetOnCheckedChangeListener(this);
39 
40 
41             SetupIntent();
42         }
43 
44         public void OnCheckedChanged(CompoundButton buttonView, bool isChecked)
45         {
46             if (isChecked)
47             {
48                 switch (buttonView.Id)
49                 {
50                     case Resource.Id.radio_button0:
51                         this.mTabHost.SetCurrentTabByTag("A_TAB");
52                         break;
53                     case Resource.Id.radio_button1:
54                         this.mTabHost.SetCurrentTabByTag("B_TAB");
55                         break;
56                     case Resource.Id.radio_button2:
57                         this.mTabHost.SetCurrentTabByTag("C_TAB");
58                         break;
59                     case Resource.Id.radio_button3:
60                         this.mTabHost.SetCurrentTabByTag("D_TAB");
61                         break;
62                     case Resource.Id.radio_button4:
63                         this.mTabHost.SetCurrentTabByTag("MORE_TAB");
64                         break;
65                 }
66             }
67         }
68 
69         private void SetupIntent()
70         {
71             this.mTabHost = this.TabHost;
72             TabHost localTabHost = this.mTabHost;
73 
74             localTabHost.AddTab(BuildTabSpec("A_TAB", Resource.String.main_home,Resource.Drawable.icon_1_n, this.mAIntent));
75 
76             localTabHost.AddTab(BuildTabSpec("B_TAB", Resource.String.main_news,
77                 Resource.Drawable.icon_2_n, this.mBIntent));
78 
79             localTabHost.AddTab(BuildTabSpec("C_TAB",
80                 Resource.String.main_manage_date, Resource.Drawable.icon_3_n,
81                 this.mCIntent));
82 
83             localTabHost.AddTab(BuildTabSpec("D_TAB", Resource.String.main_friends,
84                 Resource.Drawable.icon_4_n, this.mDIntent));
85 
86             localTabHost.AddTab(BuildTabSpec("MORE_TAB", Resource.String.more,
87                 Resource.Drawable.icon_5_n, this.mEIntent));
88 
89         }
90 
91         private TabHost.TabSpec BuildTabSpec(string tag, int resLabel, int resIcon, Intent content)
92         {
93             return this.mTabHost.NewTabSpec(tag).SetIndicator(GetString(resLabel),
94                 Resources.GetDrawable(resIcon)).SetContent(content);
95         }
96     }
複製代碼

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

相關文章
相關標籤/搜索