上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键、返回键、菜单键等)均可通过该按键事件被捕获。

但是,按键重写在 MainActivity 中,音量键按下时执行的方法在其他页面中。

作者冒出了一个不成熟的想法:利用(publish-subscribe)模式,在 MainActivity 中定义发布者(publish),实例化后层层传递到达 我的页面中,,再将实例化后的订阅者(subscribe)连接上。如图从左到右依次为类实例化的顺序:

方案实现:

1、发布者订阅者类设计

  1. namespace NetworkAssistant
  2. {
  3. //声明按键事件监听委托接口
  4. public delegate void OnKeyDown_callback(int keyCode);
  5. //按键事件发布者
  6. public class MyKeyEventPublish
  7. {
  8. private int KeyCode;
  9. public Action<int> OnKeyDown { set; get; }
  10. public int OnKeyDownChanged
  11. {
  12. get { return KeyCode; }
  13. set
  14. {
  15. KeyCode = value;
  16. OnKeyDown?.Invoke(value);
  17. }
  18. }
  19. }
  20. //按键事件订阅者
  21. public class MyKeyEventSubscribe
  22. {
  23. OnKeyDown_callback cb;
  24. public MyKeyEventSubscribe(OnKeyDown_callback _cb)
  25. {
  26. cb = _cb;
  27. }
  28.  
  29. public void OnKeyDown( int newKeyCode)
  30. {
  31. Console.WriteLine($"[{newKeyCode}]");
  32. cb?.Invoke(newKeyCode);
  33. }
  34. }
  35. }

2、MainActivity.cs

  1. //按键事件发布者
  2. MyKeyEventPublish myKeyEventPublish;
  3. protected override void OnCreate(Bundle savedInstanceState)
  4. {
  5. //实例化按键事件发布者
  6. myKeyEventPublish = new MyKeyEventPublish();
  7. TabLayoutResource = Resource.Layout.Tabbar;
  8. ToolbarResource = Resource.Layout.Toolbar;
  9.  
  10. base.OnCreate(savedInstanceState);
  11.  
  12. Xamarin.Essentials.Platform.Init(this, savedInstanceState);
  13. global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
  14.  
  15. LoadApplication(new App(myKeyEventPublish));
  16. }
  17.  
  18. public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e)
  19. {
  20. //键值更改事件发布方法
  21. myKeyEventPublish.OnKeyDown((int)keyCode);
  22.  
  23. //switch (keyCode)
  24. //{
  25. // case Keycode.VolumeUp:
  26. // Message.ShortAlert("音量上");
  27. // break;
  28. // case Keycode.VolumeDown:
  29. // Message.ShortAlert("音量下");
  30. // break;
  31. // default:break;
  32. //}
  33.  
  34. return true;//屏蔽按键原有功能
  35. //return base.OnKeyDown(keyCode, e);//不屏蔽原有功能
  36. }

3、App.cs

  1. namespace NetworkAssistant
  2. {
  3. public partial class App : Application
  4. {
  5. public App(MyKeyEventPublish myKeyEventPublish)
  6. {
  7. InitializeComponent();
  8.  
  9. MainPage = new MainPage(myKeyEventPublish);
  10. }
  11.  
  12. protected override void OnStart()
  13. {
  14. // Handle when your app starts
  15. }
  16.  
  17. protected override void OnSleep()
  18. {
  19. // Handle when your app sleeps
  20. }
  21.  
  22. protected override void OnResume()
  23. {
  24. // Handle when your app resumes
  25. }
  26. }
  27. }

4、MainPage.cs

  1. //按键事件发布者
  2. MyKeyEventPublish myKeyEventPublish;
  3. //按键事件接收者
  4. MyKeyEventSubscribe myKeyEventSubscribe;
  5. public MainPage(MyKeyEventPublish mkp)
  6. {
  7. //实例化按键事件发布者
  8. myKeyEventPublish = mkp;
  9. //实例化按键事件接收者
  10. myKeyEventSubscribe = new MyKeyEventSubscribe(OnKeyDownCallBack);
  11. //增加订阅
  12. myKeyEventPublish.OnKeyDown += myKeyEventSubscribe.OnKeyDown;
  13.  
  14. InitializeComponent();
  15. }
  16. void OnKeyDownCallBack(int keyCode)
  17. {
  18. if (keyCode == )
  19. {//音量键上
  20. //Message.ShortAlert("音量键上");
  21. SendData("VU");
  22. }
  23. else if (keyCode == )
  24. {//音量键下
  25. //Message.ShortAlert("音量键下");
  26. SendData("VD");
  27. }
  28.  
  29. Console.WriteLine("按键按下:"+keyCode);
  30.  
  31. }

欢迎讨论,非常感谢

Xamarin Android 监听音量键(下)的更多相关文章

  1. xamarin Android 监听音量键(上)

    public override bool OnKeyDown([GeneratedEnum]Android.Views.Keycode keyCode, KeyEvent e) { switch (k ...

  2. vs xamarin android 监听返回键退出程序

    public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode. ...

  3. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...

  4. android 监听返回键

    android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...

  5. Android 监听返回键退出程序的两种实现

    1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...

  6. Android 监听返回键、HOME键

    拦截返回键,HOME键,继承BaseActivity即可 import android.app.Activity; import android.content.BroadcastReceiver; ...

  7. android 监听Home键

    /** * Home 键监听,当按下Home键时,系统会发出action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的BroadcastReceiver * 在程序里动态注册 ...

  8. Android监听Home键

    监听广播  ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...

  9. Android监听HOME键的最简单的方法

    public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInsta ...

随机推荐

  1. Docker-Compose搭建单体SkyWalking

    SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...

  2. Ceph Plugin - Dashboard - By Anoyi

    ▶ 部署 Dashboard 1.安装 ceph-mgr-dashboard yum install -y ceph-mgr-dashboard 2.禁用 SSL ceph config set mg ...

  3. 使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S

    使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S 先行条件: 1.了解NetCore项目基础命令,如dotnet publish   等几个常用命令. 2.了解Dock ...

  4. Linux系统下word转pdf,xls转pdf,ppt转pdf

    word转换pdf的技术方案,供参考.[doc/docx/ppt/pptx/xls/xlsx均支持转换]           本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换 ...

  5. [POJ2942]Knights of the Round Table(点双+二分图判定——染色法)

    建补图,是两个不仇恨的骑士连边,如果有环,则可以凑成一桌和谐的打麻将 不能直接缩点,因为直接缩点求的是连通分量,点双缩点只是把环缩起来 普通缩点                             ...

  6. WinForm控件之【ListView】

    基本介绍 项列表控件,拥有五种不同视图的样式供展示项集合. 常设置属性 Columns:‘详细信息’视图中用来显示的列: Groups:ListView列表中的组,将列表各项分组区域展示: Horiz ...

  7. 【超详细】vultr(CentOS7)+LNMP+WordPress 搭建个人博客

    心血来潮想搭建个人博客,我的vps只用来搭ss未免太过浪费 在这里记录一下搭建个人博客的历程 0x00 写在前面 why vultr: 优点:便宜. 性能优良.按时间计费(不用包年 学生党的福音).稳 ...

  8. [LeetCode] 107 Binary Tree Level Order Traversal II (easy)

    原题 层序遍历,从自底向上按层输出. 左→右→中 解法一 : DFS,求出自顶向下的,最后返回时反转一下. class Solution { public: vector<vector<i ...

  9. Cesium 学习(三)各种资源链接

    1.前言 前面已经介绍如何获得以及安装部署Cesium,接下来分享下学习资源链接,其中访问最多的是官网以及超图.火星的demo网站. 2.官网地址及介绍 官网:https://cesiumjs.org ...

  10. 【Arduino】66种传感器系列实验(1)---干簧管传感器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和各种模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里 ...