我需要在平纹棉布上禁用触摸手势(红色突出显示的部分)。我只想用滑动来解开抽屉。
问题是,当抽屉布局打开并且我需要从红色突出显示部分下方的ListView中选择一个元素时,发生的事情是抽屉被关闭,此时我只能从ListView中选择一个元素
我需要直接从ListView中选择元素,也就是在打开抽屉时
答案 0 :(得分:3)
您必须为此创建自定义抽屉
if (+sessionStorage.reloadedAt > Date.now() - 30000) {
// Do your checks
}
注意:public class CustomDrawer extends DrawerLayout {
public CustomDrawer(Context context) {
super(context);
}
public CustomDrawer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomDrawer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if(isDrawerOpen(Gravity.START)){
if(event.getX() > getChildAt(1).getWidth()){
return false;
}
}
return super.onInterceptTouchEvent(event);
}
}
应该是您将重力作为“开始”的孩子,其宽度决定了开口抽屉的宽度。
我希望这可以解决你的问题
答案 1 :(得分:1)
我在这里问了一个问题:
How to vary between child and parent view group touch events
正在触发parent
(drawer
)ontouchevent
,而不是child
,listview
。
我在这里也回答了类似的问题:
https://stackoverflow.com/a/28180281/3956566
您需要管理您的触摸事件,以便由孩子处理。您需要使用onInterceptTouchEvent
并返回false。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// returning false means the child will handle the touch event.
return false;
}
然后,您为列表视图管理touchevent
:
@Override
public boolean onTouchEvent(MotionEvent ev) {
// This method will only be called if the touch event was intercepted in
// onInterceptTouchEvent
// TODO Select your listview item.
}
您还可以确定正在进行的触摸事件的类型,例如,滚动并确定孩子或父母是否将管理事件。
Managing Touch Events in a ViewGroup
根视图开始将事件调度到其子项。让我们 假设我们有这种层次结构:
A - ViewGroup1(B的父)。
B - ViewGroup2(C的父)。
C - 查看(B的孩子)
- 接收触摸/点按/点击。现在根视图将调用 A.dispatchTouchEvent()。现在是ViewGroup.dispatchEvent()的工作 (而不是View.dispatchEvent())是查找所有子视图和视图 边界包含触摸点坐标的组(使用命中 测试算法)。当它找出相关儿童的清单时, 它开始通过调用它们来调度事件给它们 dispatchTouchEvent()。这是一个重要的部分。在dispatchTouchEvent()之前 呼叫孩子,A.dispatchTouchEvent()将首先调用 A.onInterceptTouchEvent()查看视图组是否感兴趣 拦截事件并自行处理后续手势 (滚动是一个很好的用例,B上的投掷应该导致 滚动A)。 onInterceptTouchEvent()方法仅可用 在视图组(因为他们是可以成为父母/容器的人 拦截触摸事件的要求,可以保持一个 注意事件并通过返回真实来劫持它。如果返回false 然后像往常一样继续调度,即B.dispatchTouchEvent() (孩子)将被召唤。但是在返回true时,这就是将要发生的事情:
ACTION_CANCEL将被派遣给所有的孩子 一切 后续手势事件(直到ACTION_UP / ACTION_CANCEL)将是 由事件监听器(OnTouchListener.onTouch())消耗的if 定义,否则在A级别的事件处理程序A.onTouchEvent() A.onInterceptTouchEvent()本身永远不会再被调用。
如果您需要更多解释,请告诉我。
答案 2 :(得分:-2)
只需将android:clickable="true"
添加到抽屉菜单。