上篇在 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 == )
{//音量键上
//Message.ShortAlert("音量键上");
SendData("VU");
}
else if (keyCode == )
{//音量键下
//Message.ShortAlert("音量键下");
SendData("VD");
} Console.WriteLine("按键按下:"+keyCode); }

欢迎讨论,非常感谢

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. webpack4基础入门操作(一)

    基于webpack4实践:开始:打开控制面板,制定到创建Webpack的文件夹. 并创建初始配置文件package.json 输入命令:npm init -y,在文件夹中出现一个package.jso ...

  2. lleetcode 1 two sum c++

    Problem describe:https://leetcode.com/problems/two-sum/ Given an array of integers, return indices o ...

  3. Jenkins部署Web项目到远程tomcat

    1.填加插件Deploy to container Plugin. 2.在构建任务中填加构建后操作.并做如下配置: WAR/EAR files:是war包的相对路径,如target/xxx.war c ...

  4. Shell文件

    #!/bin/bashecho "======================欢迎来到进爷故事会======================="echo "******* ...

  5. Scrum 使用絮叨

    关于Scrum 的一些絮叨 Scrum 的推行的基础在于全员参与,全员协作,包含Dev, QA(quality assurance) ,BA(Business analyst)以及Supporter ...

  6. [机器学习] k-近邻算法(knn)

    最近在参加大数据的暑期培训,记录一下学习的东西. 引言 懒惰学习法:简单的存储数据,并且一直等待,直到给定一个检验数据,才进行范化,以便根据与存储的训练元组的相似性对该检验数据进行分类.懒惰学习法在 ...

  7. poi解析excel文件报错

    getFileMagic() only operates on streams which support mark(int) 使用 bis 解决 BufferedInputStream bis = ...

  8. 了解使用wireshark抓包工具

    一.简介 1.什么是wireshark 百度: Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wires ...

  9. <<Modern CMake>> 翻译 1. CMake 介绍

    <<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...

  10. Spark 源码分析系列

    如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...