Xamarin Android 開發,獲取按鍵狀態,並利用publish-subscribe模式通知到子界面。 ...
上篇在 MainActivity 中重寫了按鍵事件(OnKeyDown),獲取了音量鍵鍵值並列印了出來,當然,手機物理按鍵和虛擬按鍵(音量鍵、返回鍵、菜單鍵等)均可通過該按鍵事件被捕獲。
但是,按鍵重寫在 MainActivity 中,音量鍵按下時執行的方法在其他頁面中。
作者冒出了一個不成熟的想法:利用(publish-subscribe)模式,在 MainActivity 中定義發佈者(publish),實例化後層層傳遞到達 我的頁面中,,再將實例化後的訂閱者(subscribe)連接上。如圖從左到右依次為類實例化的順序:
方案實現:
1、發佈者訂閱者類設計
namespace NetworkAssistant { //聲明按鍵事件監聽委托介面 public delegate void OnKeyDown_callback(int keyCode); //按鍵事件發佈者 public class MyKeyEventPublish { private int KeyCode; public Action<int> OnKeyDown { set; get; } public int OnKeyDownChanged { get { return KeyCode; } set { KeyCode = value; OnKeyDown?.Invoke(value); } } } //按鍵事件訂閱者 public class MyKeyEventSubscribe { OnKeyDown_callback cb; public MyKeyEventSubscribe(OnKeyDown_callback _cb) { cb = _cb; } public void OnKeyDown( int newKeyCode) { Console.WriteLine($"[{newKeyCode}]"); cb?.Invoke(newKeyCode); } } }
2、MainActivity.cs
//按鍵事件發佈者 MyKeyEventPublish myKeyEventPublish; protected override void OnCreate(Bundle savedInstanceState) { //實例化按鍵事件發佈者 myKeyEventPublish = new MyKeyEventPublish(); TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App(myKeyEventPublish)); } public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { //鍵值更改事件發佈方法 myKeyEventPublish.OnKeyDown((int)keyCode); //switch (keyCode) //{ // case Keycode.VolumeUp: // Message.ShortAlert("音量上"); // break; // case Keycode.VolumeDown: // Message.ShortAlert("音量下"); // break; // default:break; //} return true;//屏蔽按鍵原有功能 //return base.OnKeyDown(keyCode, e);//不屏蔽原有功能 }
3、App.cs
namespace NetworkAssistant { public partial class App : Application { public App(MyKeyEventPublish myKeyEventPublish) { InitializeComponent(); MainPage = new MainPage(myKeyEventPublish); } protected override void OnStart() { // Handle when your app starts } protected override void OnSleep() { // Handle when your app sleeps } protected override void OnResume() { // Handle when your app resumes } } }
4、MainPage.cs
//按鍵事件發佈者 MyKeyEventPublish myKeyEventPublish; //按鍵事件接收者 MyKeyEventSubscribe myKeyEventSubscribe; public MainPage(MyKeyEventPublish mkp) { //實例化按鍵事件發佈者 myKeyEventPublish = mkp; //實例化按鍵事件接收者 myKeyEventSubscribe = new MyKeyEventSubscribe(OnKeyDownCallBack); //增加訂閱 myKeyEventPublish.OnKeyDown += myKeyEventSubscribe.OnKeyDown; InitializeComponent(); } void OnKeyDownCallBack(int keyCode) { if (keyCode == 24) {//音量鍵上 //Message.ShortAlert("音量鍵上"); SendData("VU"); } else if (keyCode == 25) {//音量鍵下 //Message.ShortAlert("音量鍵下"); SendData("VD"); } else { Console.WriteLine("按鍵按下:"+keyCode); } }
歡迎討論,非常感謝