摘要:[Xamarin.Android] Navigation Drawer (一)
在iOS或Android手機程式裡面常見到的應用,可以讓你從左邊拖拉出一個選單控制頁出來。這個應用在許多App上都有見過。這類型的應用在手機上很常見,無論是iOS或者是Android,在開始討論這樣的設計方式前,順便複習一下委派。
Displaying the navigation drawer
根據developer.android.com網站上的定義,
使用者可以從手機畫面的左邊拖拉出Drawer(抽屜)的控制項 或者是按下Action Bar左上方的按鈕。
然後使用者可以經由點選navigation drawer上的選項來開啟drawer panel。
Dismissing the navigation drawer
當navigation drawer顯示在畫面上的時候,你可以經由4種方法關閉navigation drawer。
l 點選主要的畫面,來關閉navigation drawer。
l 在手機畫面上的地方做出從右滑向左邊的動作。
l 點選Action bar上面的App icon
l 按下Android手機上的Back鍵
事件委派
在開始看程式之前,需要了解一下關於委派的這個觀念
整個事件委派機制可以用簡單的一句話,當我這邊甚麼事件發生的時候,你要處理甚麼動作。
很抽象嗎?
那就用一張圖與訂Pizza這個故事來講解委派。
情境 :
假設我們要向PizzaHat訂購Pizza。而希望在Pizza烤好的時候,由PizzaHat通知我來拿Pizza。
在這樣的情境下,至少就有兩個物件,PizzaHat 與顧客。
這兩個物件的關係,實際上要”走”去PizzaHat拿Pizza這個method是在顧客身上,而真正觸發顧客執行這個動作的其實是PizzaHat。所以整個結構可以看做
顧客把”走路去PizzaHat拿Pizza的這件事” 交由 PizzaHat來觸發。
( 換句話說: 委派給店家來處理,交由店家來代理 )
事件委派規格
再論委派,在建立委派機制的時候必須建立事件委派規格。這句話又有點抽象了,何謂事件委派規格 ?
假設您需要委派事件給某個人,那被你委派的那個人至少要具備一定的能力。
舉例說:
1.我想要委派小明幫我寫C#的程式,那小明就至少要知道怎麼寫C#的程式吧?
2. 或者: 如果我想要委派小強在時間到的時候通知我,那小強就至少要知道怎麼通知我。
所以你需要當Pizza烤好的時候,請店家通知你,那你就需要宣告如何讓店家通知你的事件委派宣告。
public delegate void PizzkOKHandler(object sender, PizzaTypeArgs e);
當事件發生,你需要傳遞給外部事件處理常式的物件,必須封裝在自訂的EventArgs裡面。
// 傳遞出去的物件
public class PizzaTypeArgs : System.EventArgs {
public string PizzaType {get; set;}
}
完整個程式碼參考
// 1.建立一個委派規格
public delegate void PizzkOKHandler(object sender, PizzaTypeArgs e);
class Program{
static void Main(string[] args)
{
var pizzaHatobj = new PizzaHat();
var Ben = new user();
//註冊事件處裡常式
pizzaHatobj.PizzaOK += Ben.Gallme;
pizzaHatobj.OnPizzaOK();
Console.ReadLine();
}
}
//建立一個PizzaHat class
class PizzaHat {
//宣告一個事件,當事件被指向Handler特定eventHandler時,呼叫這個事件的同時,
//就必須要符合事件規範,帶入特定的EventArgs
public event PizzkOKHandler PizzaOK;
//觸發事件的方法
public void OnPizzaOK() {
if (PizzaOK != null)
{
//要傳到外部嘗式的值
var PizzaTypeArgsobj = new PizzaTypeArgs();
PizzaTypeArgsobj.PizzaType = "夏威夷Pizza";
//觸發事件,把自己的記憶體指標與物件傳遞給外部
PizzaOK(this, PizzaTypeArgsobj);
}
else
{
Console.WriteLine("沒有註冊事件處理常式");
}
}
}
//使用者物件
class user {
public void Gallme(object sender, PizzaTypeArgs e)
{
Console.WriteLine("我的" + e.PizzaType + "已經好了,走路去拿吧");
}
}
// 傳遞出去的參數值
public class PizzaTypeArgs : System.EventArgs {
public string PizzaType {get; set;}
}
執行這個程式可以看到以下的結果。
複習完委派,接著會在下一個章節來討論如何在Xamarin.Android上來實作這個抽屜選單的功能。
也可以在底下的連結下載檔案。
DrawerSample
https://github.com/Cheesebaron/DrawerSample
參考文獻:
Navigation Drawer
http://developer.android.com/design/patterns/navigation-drawer.html
DrawerSample
https://github.com/Cheesebaron/DrawerSample