微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android导航抽屉不能将TouchEvent传递到活动

我有一个使用 Android NavigationDrawer的活动.
当只使用碎片(像往常一样),一切都很完美.
但是现在我想使用这个抽屉来应对我的应用程序的其他活动,对于其中的一些,
我不想让主视图成为片段.


问题是,活动本身的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并做一些思考,也许会导致一些奇怪的结果(使用LAST
例如,我还没有看到任何,但是)

无论如何,向后看的相关问题可以帮助理解这个问题(稍后将对第一个问题进行说明):
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;
}

这就是现在!希望它会帮助未来的人在我身边,呵呵.

原文地址:https://www.jb51.cc/android/311532.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐