更改SlidingDrawer响应轨迹球或光标的方式

RTS*_*lio 6 android slidingdrawer

(请注意,此问题中描述的行为只是因为我们正在做的其他看似无关的事情而出现.请参阅接受的答案.)

我们有一个带有a GridView和a的SlidingDrawer内部的Android活动RelativeLayout.此活动响应轨迹球(或光标键)的方式相当奇怪.焦点将在GridView中的项目之间移动,但每当光标在GridView的"out"方向移动时.(例如,当在顶部时向上,当已经在最左边的项目时离开)滑动抽屉打开或关闭.值得注意的是,焦点停留在GridView中的相同项目上 - 它不会移动到滑动抽屉.

使用轨迹球这是特别可怕的,因为将轨迹球旋转到您的真实目的地将导致滑动抽屉反复打开和关闭.

我们已经确定我们可以完全通过覆盖来关闭轨迹球onTrackballEvent().我们希望轨迹球和光标在GridView上正常工作,但不会导致滑动抽屉打开或关闭.原则上我们也喜欢轨迹球在打开时专注于滑动抽屉的各种内容.

怎么样?

RTS*_*lio 0

事实证明,这个问题是我们由于一些不相关的愚蠢行为造成的。我们想要MENU打开和关闭的钥匙SlidingDrawer。我们通过重写来做到这一点onPrepareOptionsMenu()

public boolean onPrepareOptionsMenu (Menu menu) {
    slidingDrawer.animateToggle();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这很好用;但事实证明,当菜单不打开时可以调用它。特别是,如果Activity使用setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT),则未处理的按键事件将最终访问菜单。这包括轨迹球离开屏幕边缘的运动。

获得所需行为的不太愚蠢的方法是

public boolean onKeyUp(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_MENU) {
        slidingDrawer.animateToggle();
    }
    return super.onKeyUp(keyCode,event);
}
Run Code Online (Sandbox Code Playgroud)

SlidingDrawer同时,我们可以通过设置一个SlidingDrawer.OnDrawerOpenListenerwhich调用来让轨迹球在打开时移动

slidingDrawer.getContent().requestFocus();
Run Code Online (Sandbox Code Playgroud)

最后,打电话似乎是个好主意

slidingDrawer.getHandle().setFocusable(false);
Run Code Online (Sandbox Code Playgroud)