我有一个使用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
)。
任何建议都将受到欢迎。
答案 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(...);
}
}
这显然不是一个可爱,干净的解决方案。如果您有更好的选择,请分享。