我需要禁用滑动以打开/关闭 SlidingPaneLayout,因为我的主视图是地图。我将使用按钮打开/关闭它。
6 回答
子类化SlidingPaneLayout
,覆盖onInterceptTouchEvent()
并使其始终返回false
。这将阻止SlidingPaneLayout
处理触摸事件。
有关详细信息,请参阅http://developer.android.com/training/gestures/viewgroup.html。
更新:
如果子视图没有处理触摸事件,仍然会调用SlidingPaneLayout
'方法。onTouchEvent()
要完全禁用处理触摸事件,还要覆盖onTouchEvent()
并始终返回false
。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;
}
注意:这种方法的缺点是,当第二个子视图仅部分可见时,触摸事件仍会被分派到第二个子视图。因此,您可能想查看其他答案。
这个有点棘手。如果您始终返回 true,onInterceptTouchEvent()
它将向下面的隐藏内容发送事件。我能够像这样实现它:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return !slidingEnabled || super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!slidingEnabled) {
// Careful here, view might be null
getChildAt(1).dispatchTouchEvent(ev);
return true;
}
return super.onTouchEvent(ev);
}
如果您想禁用“拖动打开”事件并在打开布局后启用用户输入,您可以使用这个
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if(!isOpen()) return false;
return super.onInterceptTouchEvent(arg0);
}
以 Roman Zhilichs 的回答为基础,进行了两项改进。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return !swipeEnabled || super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!swipeEnabled) {
if (!getChildAt(0).dispatchTouchEvent(ev)) {
ev.offsetLocation(-getChildAt(0).getWidth(),0);
getChildAt(1).dispatchTouchEvent(ev);
}
return true;
}
return super.onTouchEvent(ev);
}
首先,这会尝试将 MotionEvent 分派给第一个孩子,然后再分派给第二个孩子。这样,两个子视图都保持交互。其次,调度到第二个子视图的 MotionsEvents 必须偏移第一个视图的宽度。这假设滑动窗格从左侧滑入,就像 SlidingPaneLayout 一样。
如果设置 touchlistener 并返回 true,它将消耗触摸事件,并且小部件不会进一步处理它。
slidingPaneLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return true;
}
});
我知道这个线程很旧,但如果有人想在不覆盖任何内容的情况下解决这个问题,您只需要将布局菜单的宽度设置layoutParams
为零。
binding.clMenu.layoutParams.width = 0
中clMenu
声明的第一个布局在哪里SlidingPaneLayout
。