[Xamarin.Android] Navigation Drawer 與委派(一)

摘要:[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