C# 入門指南

單元 32 - 整合功能

~~學習進度表~~

編碼功能要整合到 App 中,同樣要把定義 Encrypt 類別 (class) 的 Program.cs 加入到專案 (project) ,在方案總管的專案圖示點擊滑鼠右鍵,利用快選功能表點擊「加入」「現有項目」

然後開啟 EncryptWpfApp 專案,勾選 Program.cs ,點擊加入按鈕

下面依紅色框框部分加入程式碼

完整程式請參考「範例程式篇」的「 EncodeActivity.cs 」。

先看到最上方 using 的部分,這裡要引入 EncryptNamespaceXamarin.Essentials

using EncryptNamespace;
using Xamarin.Essentials;

然後建立 string 型態的私有欄位 (private field) result ,連帶建立 Result 屬性 (property)

private string result;
public string Result { get => result; set => result = value; }

下面 OnCreate() 方法 (method) 內的第一部份

base.OnCreate(savedInstanceState);
Platform.Init(this, bundle: savedInstanceState);

base.OnCreate() 是預設的程式碼,下一行是我們自行加入的,其實這一行會在 MainActivity.cs 預設建立,然後新建的 Activity 檔案並不會預先加入,所以這裡要自行加入。

下面的程式碼依按鈕分成三部分來講

先看到 IDbutton_home回首頁按鈕

Button backButton = FindViewById<Button>(Resource.Id.button_home);
backButton.Click += (sender, e) =>
{
    StartActivity(new Intent(this, typeof(MainActivity)));
};

回首頁按鈕是呼叫 StartActivity() ,將頁面切換回 MainActivity.cs

下面的部分一共用了三個 App 元件,分別是最上方輸入文字的 edit_text ,顯示結果的 text_view ,以及 IDbutton_encode編碼按鈕

EditText userinput = (EditText)FindViewById<EditText>(Resource.Id.edit_text);
TextView resulttext = (TextView)FindViewById<TextView>(Resource.Id.text_view);
Button encodeButton = FindViewById<Button>(Resource.Id.button_encode);
encodeButton.Click += (sender, e) =>
{
    Encrypt encryptObject = new Encrypt();
    if (userinput.Text == "")
    {
        resulttext.Text = "沒有輸入英文句子!";
    }
    else
    {
        Result = resulttext.Text;
        resulttext.Text = encryptObject.ToEncode(userinput.Text);
    }
};

簡單說,先建立 Encrypt 型態的 encryptObject ,注意 encryptObject 在這裡只是區域變數 (local variable) ,然後檢查使用者是否有輸入,如果沒有輸入就直接顯示 "沒有輸入英文句子!" ,反之有輸入就進行隨機編碼,並將編碼結果儲存到 Result 屬性。

最後是 IDbutton_copy拷貝按鈕

Button copyButton = FindViewById<Button>(Resource.Id.button_copy);
copyButton.Click += async (sender, e) =>
{
    await Clipboard.SetTextAsync(resulttext.Text);
};

注意,這裡的匿名方法宣告為 async

copyButton.Click += async (sender, e) =>

意思是說,使用者按下拷貝按鈕後,這個方法中宣告為 await 的陳述 (statement) 會以非同步的方式執行,裡頭宣告為 await 的陳述只有一行

await Clipboard.SetTextAsync(resulttext.Text);

這是把編碼結果的 resulttext 中的文字設定給系統剪貼簿,也就是使用者可以貼到其他地方。

傳統程式設計的執行步驟是依序的,依序的意思就是完成第一項,才去進行第二項,接著依序完成排成上的所有工作,非同步程式設計 (asynchronous programming) 像是同時展開多項工作,每一項完成後就回傳結果,並不一定等到特定項目完成,才去執行下一個項目,像是我們在做餐點時,可能先煮飯,然後燒菜同時煮湯,並沒有等到煮飯煮好才燒菜,也不會等到燒菜燒好才煮湯,換句話說,以上的程式碼是等待使用者做貼上的動作才會去複製文字到剪貼簿。

以下來試看看囉!先編碼

然後按下拷貝按鈕,再貼到輸入欄

編碼結果貼到輸入欄如下

繼續按下回首頁按鈕,就回到目錄頁

好了,簡單 App 到這裡已做完,下一單元繼續加入自訂的 App 圖示與實機測試。

相關教學影片

上一頁 單元 31 - 換頁
回 C# 入門指南首頁
下一頁 單元 33 - 自訂 App 圖示與實機測試
回 C# 教材首頁
回程式語言教材首頁
中英文術語對照
非同步程式設計asynchronous programming
類別class
區域變數local variable
方法method
私有欄位private field
專案project
屬性property
陳述statement
參考資料
1. Visual Studio | Microsoft Docs - Xamarin.Android 使用者入門
2. Microsoft Docs - 使用 async 和 await 進行非同步程式設計
重點整理
1. 在「方案總管」用快顯功能表可以直接加入現有的程式檔案。
2. 新增的 Activity 中要先引入 Xamarin.Essentials ,然後呼叫 Platform.Init()
3. 三個按鈕分別用不同的控制項,回首頁按鈕利用 StartActivity()Intent 切換到 MainActivity編碼按鈕直接顯示輸入英文字串編碼後的文字,拷貝按鈕利用 asyncawait 將編碼結果拷貝到 Android 的系統剪貼簿。
4. 關鍵字 asyncawait 用來進行非同步程式設計。
問題與討論
1. 為什麼 encodeObject 要設計成區域變數?而編碼結果要設計為屬性?
2. 為什麼要直接顯示編碼結果, Andorid App 不能像 Windows App 一樣先新建,然後才編碼嗎?
3. 什麼是非同步程式設計?為什麼拷貝到 Android 的系統剪貼簿要用非同步程式設計?
練習
1. 承接上一單元的 HelloAndroidDemo 專案,在 MainActivity 類別中加入 int 型態的 Count 屬性, Count 記錄使用者按下按鈕的次數。
2. 承接上一單元的 GuessAndroidDemo 專案,設定按下按鈕就啟動 GameActivity ,並且用 Intent 物件的 PutExtra() 方法傳遞數字數量給 GameActivity