[譯]:Xamarin.Android開發入門——Hello,Android深入理解


返回索引目錄
原文鏈接:Hello, Android_DeepDive.
譯文鏈接:Xamarin.Android開發入門——Hello,Android深入理解
本部分介紹利用Xamarin開發Android應用程序

Hello, Android Deep Dive

在Hello, Android Quickstart(原文譯文)中,我們創建並運行了我們第一個Xamarin.Android應用程序。現在我們對Android應用如何工作進行進一步學習了解,以便於我們開發更加復雜的程序。
在本指南中我們回顧了我們在Hello,Android中的操作步驟,以此來理解我們所做的處理,與此同時,我們可以對Android應用開發基礎有一個初步的理解。

我們將涉及以下及部分主題:

  • Visual Studio介紹 —— 介紹Visual Studio和新應用的創建
  • 解析Xamarin.Android應用 —— 講訴Xamarin.Android應用的關鍵部分
  • App基礎及架構基礎 —— 介紹ActivitiesAndroid Manifest和Android開發的常用處理
  • UI界面 —— 使用Android設計器創建用戶界面
  • Activities以及Activity的生命周期 —— Activity生命周期的介紹,以及如何與界面進行關聯。
  • 測試,部署,以及收尾處理 —— 關於完善應用的一些建議,包括:測試、部署、產品提供等等。

本指南幫助你提高開發單頁面Android應用程序的技能和知識。通過通篇學習,你可以對Xamarin.Android應用的各個部分有一定的了解,以及他們是如何配合工作的。

Visual Studio介紹

Visual Studio是微軟推出的一款功能強大的IDE環境。它具有一個完備的視圖設計器、含有重構功能的文本編輯器,程序集瀏覽器、源代碼集成工具等等。在本指南中,我們將學習含有Xamarin插件的Visual Studio的一些基本功能。

Visual Studio將代碼組織為解決方案和項目。一個解決方案可以包含一個或多個項目。一個項目可以是一個應用程序(如IOS或Android)、一個支持類庫,一個測試程序等等。在我們的 Phoneword app(我們在Hello,Android教程中創建的)中,我們通過 Android Application 模板添加了一個Android項目至 Phoneword 解決方案中。我們的解決方案如下圖所示:

注:由於官網圖片失效,此處我們展示Xamarin Studio中的對應圖片

Xamarin.Android應用解析

首先我們從解決方案內容開始。在界面右側的解決方案管理器中,包含項目的目錄結構以及所有與解決方案相關的文件:

我們已經創建一個名為 Phoneword 的解決方案,並在內部加了了一個名為 Phoneword_Droid 的Android項目。下面對項目中的內容項進行介紹:

文件夾 用途
引用——Reference 包括生成和運行應用程序所需的程序集。展開它,可以看到.NET相關程序集引用,如:SystemSystem.CoreSystem.Xml,除此之外,還有Xamarin的Mono.Android引用。
Components Components目錄存放從Xamarin Components商店獲取的現成的功能項。關於更多Xamarin Components的內容,見:原文:Xamarin Components walkthrough
Assets 應用程序運行所需的文件,包括:字體文件、本地數據文件和文本文件。這個位置的文件可以通過生成的Assets類進行訪問。關於更多Android的Assets信息見:原文:Using Android Assets
Properties 包含AndroidManifest.xml文件——內容為Xamarin.Android應用所需的所有運行要求,包括:名稱、版本號、權限等。關於AndroidManifest.xml的文件內容見:原文:AndroidManifest.xmlProperties 文件夾同樣含有AssemblyInfo.cs文件——.NET程序集元數據文件。在創建應用時,最后完善里面關於我們應用的信息內容。
Resources 包含應用的資源文件,如字符串、圖片以及布局。我們可以通過Resource類在代碼中獲取操作這些資源。關於更多Android Resources的信息見:原文:Android Resources譯文:Xamarin.Android應用基礎——Android資源介紹。此目錄還包含了一個關於Resources的簡要指南—— AboutResources.txt 文件。

Resources文件夾

Resources目錄包含了三個子文件夾(drawable, layout, values)以及一個 Resource.Designer.cs 文件。關於這些項的概述見下表:

項名稱 用途
drawable drawable文件夾存放繪制資源,如圖片。在默認情況下,drawable目錄下有一個icon圖標文件——Icon.png。關於繪制資源信息內容見:drawable resources
layout layout目錄包含 Android設計文件(.axml) —— 用於為每個界面或Activity定義交互界面。項目模板自動創建一個名為 Main.axml 的默認layout文件。
values 此目錄存放XML文件——用於存儲一些簡單的值,如字符串,整數和顏色。項目模板默認創建一個字符串存儲文件—— String.xml
Resource.Designer.cs Resource類,它是一個存儲每一個資源唯一ID的分類。它是由Xamarin.Android工具自動創建,且能夠自動重建的文件。此文件不能手動修改,因為Xamarin.Android會覆蓋任何的手動修改。

App基礎及架構基礎

Android應用沒有一個單一的入口——在應用中沒有一行代碼來讓系統啟動它。取而代之的是,在將Android整個應用加載到內存期間,當Android創建其中一個類時,應用啟動。

Android的這一獨特功能對於復雜應用的設計和與Android操作系統交互會很有用。但是,正因為這個特點,也讓創建簡單的Android應用變得復雜(如:Phoneword 應用)。鑒於這個原因,我們將分兩次來介紹Android的系統架構。在本指南中,我們解析使用第一個界面作為入口的應用——這是最常用的方式。在 Hello,Android Multiscreen 指南中,我們將會深入理解更為復雜的Android體系架構,在那里面,我們會討論使用不同方式啟動應用。

Phoeword 方案 - 通過Activity啟動

當我們在模擬器或設備上第一次打開Phoneword應用時,操作系統會創建第一個 Activity 。Activity是單屏幕Android應用中的一個特殊的類,它負責繪制及控制交互界面。一旦Android創建了應用的第一個Activity,系統會加載整個應用:

由於Android應用不是線性執行的,那樣我們可以在多個入口啟動應用 —— Android有自己獨特的方式來跟蹤哪些類和文件是屬於一個應用程序。在Phoneword示例中,所有的應用的組成部分都是通過 Android Manifest xml文件來注冊到系統中的。 Android Manifest 的作用是跟蹤應用程序的內容、屬性和權限,以及將其公開給Android操作系統。我們可以將Phoneword應用理解為由Android Manifest文件整合的文件集合,包括:一個Activity界面、一個資源計划和幫助文件。正如下圖所示:

在后面幾節,我們會詳細介紹上圖中Phoneword應用的各個部分的關系,以此更好的理解它。下面我們首先從UI用戶界面開始,其中包括Android設計器和 layout 文件。

用戶界面-UI

在我們的應用中,Main.axml是首頁的用戶界面布局文件。.axml 后綴的文件表示這是一個Android設計文件(axml代表 Android XML )。從Android的角度來看,Main 的名稱可以任意,我們可以將layout文件修改為其他的名字。當我們在IDE環境中打開 Main.axml 文件,它將展示Android布局文件的可視化編輯器 —— Android designer

Phoneword 應用中,我們將 TranslateButton 的ID設置為@+id/TranslateButton

當我們設置 TranslateButton 的ID屬性時,Android設計器將 TranslateButton 控件映射到 Resource 類中,並為 TranslateButton 分配一個資源 ID 。視圖 控件與類的映射讓我們可以在后台代碼中定位和使用 TranslateButton 和其他控件。關於更多詳細的信息會在分離代碼和視圖時介紹。此處你所需要知道的是,界面控件和后台控制代碼是通過ID屬性來連接上的。

源代碼視圖

任何在界面上定義的內容都會翻譯為XML,以此提供給Xamarin.Android使用。Android設計器提供源代碼視圖——用於查看生成的XML格式內容。點擊設計界面左下方的Source標簽即可切換至XML視圖,如下圖所示:

在我們的示例中,XML源碼中應該包含 Text(large), Plain Text, 和兩個 Button 元素。

關於Android設計更深入的內容見Xamarin Android設計器概述指南:原文:Designer Overview

我們已經介紹了用戶界面設計以及與其相關的界面代碼的工具和概念。下面,讓我們看看驅動用戶界面的后台代碼部分——Activities和Activity的生命周期。

Activities和Activity生命周期

Activity類中含有控制交互界面的代碼。Activity負責響應用戶交互以及提供動態的用戶體驗。

在本節中,我們將介紹Activity類,討論Activity的生命周期,並解析在Phoneword應用中控制用戶界面的代碼。

Activity類

我們的Phoneword應用只有一個界面(Activity)。此控制界面的類名為MainActivity,它位於 MainActivity.cs 文件中。在Android中,名稱MainActivity並沒有什么特殊意義——盡管通常情況下都把應用中的第一個Activity命名為MainActivity,即使我們將其命名為其他的名稱,Android一樣可以使用。

當我們打開 MainActivity.cs 文件后,可以看到MainActivityActivity的一個子類,同時還裝飾有ActivityAttribute

    [Activity(Label = "Phoneword", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
    ...
    }

Activity特性使用Android Manifest注冊Activity,以此告訴Android系統這個類由哪個清單進行管理的部分。其中Label屬性設置界面頂端顯示的文本,Icon設置文本前的圖標,如下圖所示:

MainLauncher屬性告訴Android系統在應用啟動時顯示這個Activity。此屬性對於多個Activities(界面)的應用會比較重要,具體見:原文:Hello,Android Multiscreen

現在我們大概知道了MainActivity,下面將介紹Activity的生命周期。

Activity生命周期

在Android中,Activity在與用戶交互期間經歷生命周期中的不同階段。Activity經歷的階段有:創建、啟動、暫停、繼續和銷毀等等。在界面的生命周期中,系統會某些點調用Activity中包含的方法。下圖展示了Activity典型的生命周期情況,以及相應的方法調用情況:

通過重寫Activity生命周期中的方法,我們可以控制Activity的加載,怎么回應用戶,甚至控制在界面從設備屏幕消失后進行什么操作。例如,我們可以重寫上面示意圖中使用的方法來進行一些重要的任務:

  • OnCreate —— 創建視圖,初始化變量,以及處理一些在給用戶展示Activity之前的工作。此方法在Activity加載到內存中時執行——故執行一次。
  • OnResume —— 每次用戶切換到此Activity時都要執行的內容。
  • OnPause —— 每次用戶離開此Activity時,都要執行的操作。

當我們在Activity的生命周期方法中添加個人代碼時,我們重寫生命周期方法的基本實現。我們進入已有的生命周期方法(已經附加過代碼的方法),然后添加我們自己的代碼。我們在自己方法里調用基礎方法,以此保證在執行我們自己代碼之前執行原始的基礎代碼。我們將在下一節看到例子。

Activity生命周期是Android中一個重要又復雜的部分,在此我們將不繼續深入了解。如果在你完成入門系列后,你需要知道更多關於Activity的內容,我們建議閱讀:原文:Activity Lifecyle。下面,我們關注Activity生命周期中的OnCreate階段。

OnCreate方法

Android在創建Activity時,調用Activity中的OnCreate方法 —— 在界面呈現給用戶之前。我們可以重寫OnCreate生命周期方法來創建視圖,以及為用戶准備Activity內容:

    protected override void OnCreate (Bundle bundle)
    {
            base.OnCreate (bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);
            // Additional setup code will go here
    }

在Phoneword示例中,我們在OnCreate中處理的首要事情是將我們創建的設計界面展示給用戶。為了加載UI,我們調用SetContentView方法,並將設計文件(Main.axml)的資源名稱傳給它。我們的設計圖用Resouce.Layout.Main來定位:

    SetContentView (Resource.Layout.Main);

MainActivity啟動時,它會以Main.axml內容為基礎創建視圖。注意,我們已經將設計界面與我們的Activity進行了匹配—— Main.axml文件是針對MainActivity的設計。從Android的角度看,者不是必須的,但是當我們添加更多的界面到應用時,我們會發現如此格式的命名方式有助於我們將碼代碼與界面設計文件聯系到一塊。

一旦我們設置好界面設計文件,我們可以查找對應的控件。查找控件的方法是調用FindViewById方法並傳入控件的資源id參數:

    EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
    Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);
    Button callButton = FindViewById<Button>(Resource.Id.CallButton);

現在我們有設計界面中控件的對象,我們可以通過他們進行用戶交互響應。

響應界面交互

在Android中,Click事件監聽的是用戶觸碰。在我們的app中,我們使用了一個lambda表達式處理Click事件,但是我們還可以使用delegate委托或一個事件處理程序 。我們最終的 TranslateButton 的代碼大概如下:

    translateButton.Click += (object sender, EventArgs e) =>
    {
            // Translate user’s alphanumeric phone number to numeric
            translatedNumber = Core.PhonewordTranslator.ToNumber(phoneNumberText.Text);
            if (String.IsNullOrWhiteSpace(translatedNumber))
            {
                    callButton.Text = "Call";
                    callButton.Enabled = false;
            }
            else
            {
                    callButton.Text = "Call " + translatedNumber;
                    callButton.Enabled = true;
            }
    };

Phoneword中用到的額外概念

本指南中還有幾個在Phoneword應用中使用,卻沒有介紹的概念。其中有包括以下內容:

  • 修改按鈕文本 —— 通過修改 ButtonText 屬性來改變 Button 的文本。如下,將callButton的文本改為Call

      callButton.Text = "Call";
    
  • 啟用和禁用按鈕 —— 按鈕 可以是可用或不可用狀態。不可用的 按鈕 不會響應用戶的輸入。禁用callButton的代碼如下:

      callButton.Enabled = false;
    

關於更多按鈕的相關信息見:原文:Android Buttons guide

  • 顯示彈出框 —— 當用戶點擊 Call 按鈕時,我們的應用會顯示一個彈出框——用於用戶確認或取消撥打。我們使用了 Alert Dialog Builder 來創建彈出框。我們的彈窗由一個Neutral類型按鈕(用於撥打電話)和一個Negative類型的按鈕(用於取消撥打電話)組成,如下代碼所示:

      var callDialog = new AlertDialog.Builder(this);
      callDialog.SetMessage("Call " + translatedNumber + "?");
      callDialog.SetNeutralButton("Call",
          delegate
          {
              // Create intent to dial phone
          });
      callDialog.SetNegativeButton("Cancel", delegate {});
    
      // Show the alert dialog to the user and wait for response.
      callDialog.Show();
    
  • 使用Intent啟動電話app —— 當我們確認撥打電話后,我們調用一個 Intent 來啟動系統的電話app,並將我們需要撥打的號碼傳入,如下代碼所示:

      var callIntent = new Intent(Intent.ActionCall);
      callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber));
      StartActivity(callIntent);
    

在Hello,Android Multiscreen中我們將更加深入的介紹Intent。在那個指南中,我們會學到如何使用Intent啟動另外的Activity(界面),甚至是啟動其他應用 。

測試,部署和收尾處理

XamarinStudio和Visual Studio都提供了多種方式來測試和部署應用。本節包含內容有:調試選項、在設備上演示應用測試,以及介紹為不同的屏幕分辨率創建app圖標的工具。

調試工具

有些時候,應用代碼中的問題很難診斷出來。為了幫助分析復雜代碼中的問題,我們提供以下內容:原文:Set a Breakpoint,原文:Step Through Code, 或 原文:Output Information to the Log Window

部署到設備

模擬器是用於部署和測試應用的好工具,但是用戶不會再模擬器中使用最終app。我們應該及時並常常在真實設備上測試應用。

在Android設備可以被用於測試應用前,需要進行一些開發配置。關於准備開發設備的詳細內容見:原文:Set Up Device for Development

一旦設備配置好,我們可以將其插入到計算機,然后開發工具中可以選擇此設備,並啟動應用:

由於官網vs圖無效,此處使用xamarin studio的圖

這樣應用會自動部署到設備並運行:

為不同屏幕分辨率設置圖標Icon

Android設備有不同的屏幕大小和分辨率,因此圖片不會再所有界面都看起來好。例如,以下是低像素圖標在高分辨率的Nexus 5上的截圖。可以看到它比周圍的圖標要模糊:

為了解決這個問題,可以將不同分辨率的圖標文件添加到Resources文件夾。Android提供了不同版本的drawable文件夾來處理不同像素的圖像,其中包括:ldpi —— 低分辨率使用,mdpi —— 中等分辨率使用,hdpi —— 高分辨率使用,xhdpixxhdpi —— 用於很高分辨率的屏幕使用。不同大小的圖標存儲在對應的 drawable-* 文件夾中:

由於官網vs圖無效,故此處使用xs圖

Android會在不同屏幕上選擇對應分辨率的圖標:

生成自定義圖標

不是每個人都有專門的設計人員來創建自定義圖標和初始啟動頁面的。下面有些備用方案可以用於自定義應用插圖:

  • Android Asset Studio —— 一個基於網頁瀏覽的Android圖標生成器,同時還鏈接了一些其他有用的社區工具。最好在Chrome中操作。
  • Visual Studio —— 可以直接在IDE中為你的應用創建一些簡單的圖標
  • Glyphish —— 高品質的圖標集(可免費下載或購買)
  • Fiverr —— 選擇設計師來為你創建圖標,最低價 $5。可能命中也可能錯過,但如果你急需設計圖標,這是一個很好的去處。

關於更多圖標尺寸和要求的詳細信息見:原文:Android Resources譯文:Xamarin.Android應用基礎——Android資源介紹

總結

至此,你就可以對Xamarin.Android應用有一個比較深入的理解,同時對創建所需的工具也有一定的了解。在下一節入門系列教程中,我們將介紹多屏幕應用,同時介紹Android中更高級的架構和概念。


譯:奇葩史


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM