(请注意,此问题中描述的行为只是因为我们正在做的其他看似无关的事情而出现。请参阅the accepted answer。)
我们在GridView
内部有RelativeLayout
和SlidingDrawer
的Android活动。此活动响应轨迹球(或光标键)的方式相当奇怪。焦点将在GridView中的项目之间移动,但每当光标在GridView的“out”方向移动时。 (例如,当在顶部时向上,当已经在最左边的物品时离开)滑动抽屉打开或关闭。值得注意的是,焦点停留在GridView中的相同项目上 - 它不会移动到滑动抽屉。
使用轨迹球这是特别可怕的,因为将轨迹球旋转到您的真实目的地将导致滑动抽屉反复打开和关闭。
我们已经确定我们可以通过覆盖onTrackballEvent()
来完全关闭轨迹球。我们希望轨迹球和光标在GridView上正常工作,但不会导致滑动抽屉打开或关闭。原则上我们也喜欢轨迹球在打开时专注于滑动抽屉的各种内容。
如何?
答案 0 :(得分:3)
您可以考虑创建扩展GridView
和SlidingDrawer
的自定义视图,并为onInterceptTouchEvent
使用onTouchEvent
和GridView
的自定义实现,并为自定义实现onInterceptTouchEvent
的{{1}}。您可能不需要实施自定义SlidingDrawer
,具体取决于SlidingDrawer
为您的自定义handle
,给它一个可能定义如下的界面:
GridView
如果您的自定义public interface MyGridViewListener {
public boolean shouldPreventScroll();
}
已打开,请返回。此返回值将用于确定是否应对SlidingDrawer
上的onInterceptTouchEvent
和onTouchEvent
方法执行操作。因此,当GridView
打开时,对SlidingDrawer
执行的操作不会触发GridView
上的任何内容。
<强>活动:强>
SlidingDrawer
<强> MyCustomGridView:强>
只要MyGridView gridView = (MyGridView) findViewById(R.id.gridView);
gridView.setMyGridViewListener(new MyGridViewListener() {
@Override
public boolean shouldPreventScroll() {
return slidingDrawer.isOpened();
}
});
上发生某些触摸/跟踪事件,就会调用shouldIntercept
。
GridView
我希望这能指出你正确的方向或至少有帮助
答案 1 :(得分:1)
在使用自定义滑动抽屉时,我将手柄的布局设置为某个奇数值,如
handle.layout(0, 0,0, 0);
让手柄消失,但是从屏幕一侧拖动手指仍会打开滑动抽屉,这是我不想要的,所以我设置
handle.layout(10000, 10000, 10000, 10000);
在可视区域外移动,并且无法再通过从屏幕侧面拖动手动拉出抽屉。在查看源代码后,确定抽屉滑动的手柄位置,摆脱手柄,它应该可以解决您的问题。
如果您需要打开/关闭抽屉,请调用animateOpen()/ animateClose()
答案 2 :(得分:0)
事实证明,我们以一种无关的愚蠢行为引起了这个问题。我们想要 MENU 键来打开和关闭SlidingDrawer
。我们通过覆盖onPrepareOptionsMenu()
:
public boolean onPrepareOptionsMenu (Menu menu) {
slidingDrawer.animateToggle();
return true;
}
这很好用;但事实证明,当菜单即将打开时,可以调用它。特别是,如果Activity
使用setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT)
,则未处理的键事件将最终访问该菜单。这包括屏幕边缘的轨迹球运动。
获得理想行为的不那么愚蠢的方法是
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_MENU) {
slidingDrawer.animateToggle();
}
return super.onKeyUp(keyCode,event);
}
与此同时,我们可以通过设置SlidingDrawer
调用
SlidingDrawer.OnDrawerOpenListener
打开时移动
slidingDrawer.getContent().requestFocus();
最后调用
似乎是个好主意slidingDrawer.getHandle().setFocusable(false);