当只使用碎片(像往常一样),一切都很完美.
但是现在我想使用这个抽屉来应对我的应用程序的其他活动,对于其中的一些,
我不想让主视图成为片段.
题
问题是,活动本身的onTouchEvent()和一个孩子ListView的onItemClickedListener())不被调用,因为抽屉消耗它.
当然,我想要它被称为:)
不用说,我希望答案很简单(甚至是一个XML),希望不通过扩展Drawer类(除非这是当然需要的).
更多信息
Activity的主要布局非常简单,基本上是ListView和DrawerLayout(在XML之下).
抽屉有一个片段,因为它是childView(用于片段导航),当然也可以是Drawer Items的ListView.
常见的答案是在DrawerLayout上使用onInterceptTouch(),requestDisallowInterceptTouchEvent(),以及父视图(Activity的主要内容)甚至onTouchEvent()(带有False)返回)在抽屉的ListView上.
没有什么可以做的伎俩.
I read this link
它似乎使用截取方法某处可能是答案.但是怎么样
解决方法
例如,我还没有看到任何,但是)
无论如何,向后看的相关问题可以帮助理解这个问题(稍后将对第一个问题进行说明):
DrawerLayout prevents call of MainActivity.onTouchEvent()
2. How can I requestDisallowTouchEvents on Android DrawerLayout
Set drag margin for Android Navigation Drawer
回答
首先请注意,我在这里提供了很多例子.如果你只想要最好的(对我来说),跳到最后一个.
其次,如果有足够的声誉,请对第一个链接的问题发表评论,并提供一个链接(这可以帮助那个人).
实施例1
那么,基本上,只是扩展Android的DrawerLayout并将onTouchEvent()替换为:
@Override public boolean onTouchEvent(MotionEvent arg0) { super.onTouchEvent(arg0); return false; }
这个解决方案将做任何事情,除了它不会打开幻灯片上的抽屉,只有菜单点击等.此外,它转发点击,以便抽屉打开时
例如,触摸它将不会关闭它,但是点击任何背后的东西(例如ListView). Le’ts努力尝试…
示例2
现在,我们来看看开放OR可见的情况,返回true(并在Drawer消耗动作).
@Override public boolean onTouchEvent(MotionEvent arg0) { super.onTouchEvent(arg0); if(isDrawerOpen(findViewById(R.id.list_slidermenu)) || isDrawerVisible(findViewById(R.id.list_slidermenu))){ return true; } return false; }
这种解决方案更好,因为它可以防止抽屉打开或甚至可见时的抽屉后面的点击(幻灯片启动…).但触摸滑动仍然不起作用.
实施例3
好的,所以我们来分割一下.在抽屉的边距(Google触摸时要滑动抽屉的区域)上触摸(MotionEvent.ACTION_DOWN)
将导致True返回消耗动作,而其他人将转发事件(返回False).
@Override public boolean onTouchEvent(MotionEvent arg0) { super.onTouchEvent(arg0); float edge = 30;//that's for a left drawer obvIoUsly. Use <parentWidth - 30> for the right one. View mDrawerListView = findViewById(R.id.drawer_listview); if(isDrawerOpen(mDrawerListView) || isDrawerVisible(mDrawerListView)){ return true; } else if(arg0.getAction() == MotionEvent.ACTION_DOWN && arg0.getX() > edge){ return false; } return true; }
注意我用了30dp.这就是我发现的边缘(虽然在其中一个链接被称为20 ….).
那么下面的例子当然是根据Android来决定这个边缘(见上面的代码)的价值是甚么.我们不想
使用一个可能会改变的数字或其他.
新问题
所以现在第一个链接应该很方便.它将“抽出”抽屉代码以获得Drawer边缘/美码.但是,它对我来说没有效果,因为找不到这些确切的字段名称.
我运行mDrawerLayout.getClass().getField()返回所有的字段,但没有任何运气找到我们想要的.任何人?
最后一个例子 – 完整代码
好的,看看示例3,在了解了我做了什么之后,我们可以通过扩展onFinishInflate()方法并将其保存为全局变量来加快速度
为此CustomDrawerLayout供以后使用.我们也可以把第一个“if”放在第二个里面来节省更多的工作.这里可以:
View mDrawerListView; ... @Override protected void onFinishInflate() { super.onFinishInflate(); mDrawerListView = findViewById(R.id.drawer_listview); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if(event.getX() > 30 && event.getAction() == MotionEvent.ACTION_DOWN){ if(isDrawerOpen(mDrawerListView) || isDrawerVisible(mDrawerListView)){ return true; } else{ return false; } } return true; }
这就是现在!希望它会帮助未来的人在我身边,呵呵.