是否有可能钩到硬件键盘事件在应用程序级别?

问题描述 投票:2回答:3

我开发Xamarin.FormsiOSAndroid一个UWP应用。

我想挂接到硬件键盘事件在应用层面(而不是个人网页级别(因为它是一个Xamarin.Forms应用程序)),这样,当用户按下键盘上的键,我可以调用我的应用程序的操作。

在Android上我这样做是使用上MainActivity以下事件:。

public override bool OnKeyUp([GeneratedEnum] Keycode keyCode, KeyEvent e)
{
    //process key press
    return base.OnKeyUp(keyCode, e);
}

是否有qazxsw POI等效?

c# ios xamarin xamarin.ios xamarin.forms
3个回答
3
投票

您可以使用Xamarin iOS跟踪重点从硬件键盘按压。

keyCommands

支持硬件键盘命令的响应者对象可以重新定义该属性,并用它的UIKeyCommand对象,它支持以返回的数组。每个键命令对象表示键盘序列来识别和应答器的操作方法响应于调用。

你从这个方法返回的关键命令被应用到整个响应链。当按下一个键组合匹配的关键命令对象,UIKit中散步响应链寻找实现相应的动作方法的对象。它调用它找到的第一个对象上的方法,然后停止处理该事件。

在Xamarin.forms,你必须在iOS平台ContentPage创建自定义渲染器。然后keycommands可以在网页渲染器被加入。

如果你想在按键可以通过视图控制器(页),而不仅仅是输入控件(如输入)进行处理,使用KeyCommands使视图 - 控制,成为第一个响应者。

例如,ContentPage在iOS平台的自定义呈现可能是这样的:

canBecomeFirstResponder

注意这条线,使用using System; using Foundation; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; using KeyCommandsInXamarinForms.iOS; [assembly: ExportRenderer(typeof(ContentPage), typeof(MyCustomPageRenderer))] namespace KeyCommandsInXamarinForms.iOS { public class MyCustomPageRenderer : PageRenderer { protected override void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e); if (e.OldElement != null || Element == null) { return; } //Create your keycommand as you need. UIKeyCommand keyCommand1 = UIKeyCommand.Create(new NSString("1"), UIKeyModifierFlags.Command, new ObjCRuntime.Selector("Action")); UIKeyCommand keyCommand2 = UIKeyCommand.Create(new NSString("\t"), 0, new ObjCRuntime.Selector("Action")); //Add your keycommands this.AddKeyCommand(keyCommand1); this.AddKeyCommand(keyCommand2); } [Export("Action:")] private void Excute(UIKeyCommand keyCommand) { Console.WriteLine(String.Format("key pressed - {0}", keyCommand.Value); } //Enable viewcontroller to become the first responder, so it is able to respond to the key commands. public override bool CanBecomeFirstResponder { get { return true; } } } } 作为处理参数,那么你就需要在你的PCL任何改变:

typeof(ContentPage)


1
投票

与iOS的事情是,它没有这样的方法。首先,你需要了解你想要营造的按钮。如果你想捕捉音量按钮,那么你可以在这里找到答案:[assembly: ExportRenderer(typeof(ContentPage), typeof(MyCustomPageRenderer))]

https://forums.xamarin.com/discussion/29648/detect-volume-change-from-hardware-buttons

如果你想捕捉键盘事件,你要订阅一个观点,即是负责输入过程。

您可以使用通知中心订阅可以处理输入和在一个地方接收通知的所有意见。

public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        //KVO for outputVolume
        var session = AVAudioSession.SharedInstance();
        var errorOrNull = session.SetActive (true);
        if (errorOrNull != null) {
            //TODO: ...handle it
        }
        session.AddObserver (this, "outputVolume", NSKeyValueObservingOptions.New, IntPtr.Zero);


    }

    public override void ObserveValue (NSString keyPath, NSObject ofObject, NSDictionary change, IntPtr context)
    {
                   //TODO: Filter as appropriate, error-handling, etc.
        var volume = (float) (change ["new"] as NSNumber);

        volumeLabel.Text = volume.ToString();
    }

1
投票

我需要让数字输入+在我XamForms程序结束的进入。以下是我在Xamarin解决它形成3.0.0.482510 / Xamarin.iOS 11.10(它比凯文的回答有点不同,因为上面我想处理它在XamForms共享XAML的项目,而不是在iOS的项目):

在您的iOS项目(共享在例如名为“MobileProject”解决方案项目Xamarin表格),创建一个新的类:

NSNotificationCenter.DefaultCenter.AddObserver (UITextField.TextFieldTextDidChangeNotification, (notification) =>
{
    Console.WriteLine ("Character received! {0}", notification.Object == TextField);
});

然后,在MainPage.xaml.cs中共享应用程序,你只需要:

using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MobileProject.MainPage), typeof (com.YourCompany.iOS.KeyboardHookRenderer))]
namespace com.YourCompany.iOS
{
public class KeyboardHookRenderer : PageRenderer
{
    private string _RecvValue = string.Empty;

    public override bool CanBecomeFirstResponder
    {
        get { return true; }
    }

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);
        string key = string.Empty;
        var selector = new ObjCRuntime.Selector("KeyRecv:");
        UIKeyCommand accelerator1 = UIKeyCommand.Create((NSString)"1", 0, selector);
        AddKeyCommand(accelerator1);
        UIKeyCommand accelerator2 = UIKeyCommand.Create((NSString)"2", 0, selector);
        AddKeyCommand(accelerator2);
        UIKeyCommand accelerator3 = UIKeyCommand.Create((NSString)"3", 0, selector);
        AddKeyCommand(accelerator3);

        ... etc as many as you need or use a loop based on key id...
    }

    [Export("KeyRecv:")]
    public void KeyRecv(UIKeyCommand cmd)
    {
        if (cmd == null)
            return;
        var inputValue = cmd.Input;
        if (inputValue == "\n" || inputValue == "\r")
        {
            ((MobileProject.MainPage) Element)?.HandleHardwareKeyboard(_RecvValue);
            _RecvValue = string.Empty;
        }
        else
        {
            _RecvValue += inputValue;
        }
    }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.