guy*_*y_m 9 android navigation-drawer
我有一个Activity使用Android NavigationDrawer.当只使用fragments(像往常一样)时,一切都很完美.但现在我想drawer在我的应用程序的其他活动中使用它,对于其中一些,我不希望主视图是一个fragment.
问
的问题是,在onTouchEvent()对的activity本身(和onItemClickedListener()一个孩子的ListView这个问题)不叫,因为drawer消费它.当然,我希望它被称为:)
不用说,我希望答案很简单(甚至是XML),并希望不是通过扩展Drawer类(除非那是当然需要的).
更多信息
Activity的主要布局非常简单,基本上是a ListView和DrawerLayout它的顶部(在XML下面).
该Drawer有一个fragment,因为它是childView(对片段导航),当然,在ListView该Drawer项目.
我已经看到很多关于(不完全)类似问题的问题,而且常见的答案是在抽屉上使用onInterceptTouch(),requestDisallowInterceptTouchEvent()在DrawerLayout父视图(Activity的主要内容)和甚至onTouchEvent()(返回False)上ListView.
似乎没有什么可以做到的.
我读了这个链接
,似乎在某处使用拦截方法可能就是答案.但是怎么样?
如果您需要任何代码,请告诉我.但这是一个非常基本的代码/布局.
谢谢!
guy*_*y_m 15
显然答案有点简单,虽然它确实会让你扩展DrawerLayout并做一些思考,也许会导致一些奇怪的结果(使用最后的例子,我还没有看到任何).
无论如何,这向后看有关的问题可以帮助理解这个问题(将在大约第一个后面解释):
1. DrawerLayout防止MainActivity.onTouchEvent()呼叫
2. 我怎样才能在Android DrawerLayout requestDisallowTouchEvents
3. 设置拖累利润率为Android导航抽屉
回答
首先,请注意我在这里举了很多例子.如果你只想要最好的(对我而言),请跳到最后一个.
其次,如果某人有足够的声誉,请对第一个链接的问题发表评论并给出这个答案的链接(它可以帮助那个人).
示例1
好吧,基本上,只需扩展Android的DrawerLayout并将onTouchEvent()替换为:
@Override
public boolean onTouchEvent(MotionEvent arg0) {
super.onTouchEvent(arg0);
return false;
}
Run Code Online (Sandbox Code Playgroud)
此解决方案将执行任何操作,除了它不会在幻灯片上打开抽屉,只有菜单点击等.此外,它转发点击,所以当抽屉打开时,触摸它外面不会关闭它,但点击后面的任何东西(例如ListView).不要再努力了......
示例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;
}
Run Code Online (Sandbox Code Playgroud)
这种解决方案更好,因为当抽屉打开或甚至可见时(滑动开始...),它可以防止抽屉后面的咔嗒声.但触摸滑动它仍然无法正常工作.
示例3
好的,让我们分开案例.抽屉边距内的触摸(MotionEvent.ACTION_DOWN)(Google在触摸时希望滑动抽屉的区域)将导致返回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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用了30dp.这就是我发现的边缘(虽然在其中一个链接中据说是20 ....).
那么,根据Android的说法,下一个例子当然是决定什么是正确的边缘(参见上面的代码)值.我们不想使用可能改变的数字或其他.
新问题
现在,第一个链接应该派上用场.它"破解"抽屉代码以获得抽屉边缘/ megin数.但是,它对我不起作用,因为无法找到那些确切的字段名称.
我运行mDrawerLayout.getClass().getField()返回所有字段,但没有任何运气找到我们想要的东西.任何人?
最后一个例子 - 完整代码
好了,看看第3个例子,在理解了我做了什么后,我们可以通过扩展onFinishInflate()方法并将其保存为此CustomDrawerLayout的全局变量以供以后使用来加快速度.我们也可以将第一个"if"放在第二个"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;
}
Run Code Online (Sandbox Code Playgroud)
这就是现在!希望它能帮助未来的人,呵呵....
| 归档时间: |
|
| 查看次数: |
5939 次 |
| 最近记录: |