Xamarin Android:处理微调框下拉菜单中的硬件密钥

时间:2018-11-05 21:32:53

标签: android xamarin xamarin.android

我有一个使用Xamarin Android(不是Xamarin Forms)编写的Android应用程序。它在Zebra WT6000上运行,它具有硬件密钥“ P1”和“ P2”。默认情况下,它们分别映射为调低音量和调高音量。

在我的应用程序中,我将这些键用于其他用途(并为用户提供一种管理音频音量的替代方法)。这一切都按预期工作。

我的问题是我有一个微调器(Android.Widget.Spinner),当轻按微调器并显示下拉菜单时,默认的按钮映射重新生效,而忽略了活动中的键处理程序。

我已经尝试过了:

MySpinner.KeyPress += (sender, evt) => { /* do a thing */ };

还有:

MySpinner.SetOnKeyListener(new KeyListener());
...
private class KeyListener : Java.Lang.Object, View.IOnKeyListener
{
    public bool OnKey(View v, [GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        // do a thing
        return true;
    }
}

但是,我的lambda函数和OnKey()方法都没有被调用,并且密钥处理也没有改变。

我怀疑微调框的下拉列表是其自己的DialogFragment(具有自己的密钥处理),而不是我的活动的一部分。如果是这样,我怀疑我必须叫那个SetOnKeyListener()的{​​{1}}(而不是微调框的DialogFragment)。

任何建议都将受到欢迎。

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来做到这一点(而我所说的“做这件事”是指“打架”)。基本思想是,我有自己的自定义数组适配器(源自ArrayAdapter)来构建微调器行。在其GetDropDownView()覆盖中,我设置了父对象的KeyPress处理程序(所说的父对象作为参数传入)。

代码:

public class CustomArrayAdapter<T> : ArrayAdapter<T>
{
    private bool ParentKeyHandlerHasBeenSet;
    ...
    public override View GetDropDownView(int position, View convertView, ViewGroup parent)
    {
        if (!ParentKeyHandlerHasBeenSet && parent.Id == -1)
        {
            parent.KeyPress += (sender, evt) => { evt.Handled = true; };
            ParentKeyHandlerHasBeenSet = true;
        }

        return MyPrivateMethodThatBuildsTheView(...);
     }
}

这显然不是一个可爱,干净的解决方案。如果您有更好的选择,请分享。