【问题标题】:Pass touch events to Activity behind current Activity将触摸事件传递给当前 Activity 后面的 Activity
【发布时间】:2016-02-11 23:15:39
【问题描述】:

我有两个活动,其中一个显示 RecyclerView,另一个显示图像。单击 RecyclerView 中的一个项目会显示第二个 Activity,其中包含与单击的项目相关的小图像,并且背景是透明的,显示第一个 Activity。

我试图让第二个 Activity 忽略图像边界之外的所有触摸事件,以便列表可以与屏幕上的图像一起滚动。这可以通过

实现
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);   

但是,这仅在第二个 Activity 的窗口不占据整个屏幕时才有效。这是第二个活动布局的示例:

<?xml version="1.0" encoding="utf-8"?>
<CustomFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent">

  <ImageView
     android:id="@+id/imageView_item"
     android:layout_width="150dp"
     android:layout_height="150dp"
     android:background="@color/colorPrimary"
     android:layout_gravity="center"/>

</CustomFrameLayout>

由于 CustomFrameLayout 的高度和宽度与父级匹配,因此它会拦截所有不在 ImageView 内的触摸事件。

我认为在 CustomFrameLayout 中覆盖 onInterceptTouchEvent 可以让我使用以下代码忽略不需要的触摸事件:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (/* Is touch event within bounds of ImageView */) {
        return true;
    }
    return false; //Otherwise don't intercept
}

但这也行不通,有没有人有其他想法?

假设FrameLayout需要全屏,我不能使用Fragments,这样可行吗?

【问题讨论】:

    标签: java android android-activity touch


    【解决方案1】:

    你不能那样做。当第二个 Activity 启动时,第一个 Activity 被暂停。暂停时,它不会处理任何触摸事件。正确的做法是让您的第二个活动成为第一个活动中的片段。

    即使您设法找到强制它触摸事件的方法,它也不一定能按您希望的那样工作。当调用 onPaused 时,编写良好的 Activity 会停止很多处理。之后它可能无法正确处理触摸,并试图使其崩溃。

    【讨论】:

    • 请参阅FLAG_NOT_TOUCH_MODAL 的以下文档。它特别声明它允许您忽略来自当前窗口的触摸事件并将其传递给下面的窗口。这有效,我可以滚动第一个活动中的列表,直到第二个。问题是我的窗口是 MATCH_PARENT 并且正在捕获这些视图。
    • 到窗口。不是活动。它适用于使用自己的窗口的对话框
    • 如果 CustomFrameLayout 设置为 wrap_content 并且因此不是全屏的,那么任何超出其边界的触摸事件都会传递给后面的 Activity。你是说这不应该发生吗?
    • 对我来说听起来很像,没有用户输入应该转到暂停的活动。它可能是您可以在您的情况下使用的一个,但它不应该用于它背后的通用活动,因为如果与暂停交互,程序可能无法正常工作。通过对话框或对话框片段来做你想做的事情的正确方法。
    • 我想你在这个意义上是对的,我没有考虑到第一个 Activity 会暂停。为什么如果第一个 Activity 暂停后仍然可以滚动,我原以为暂停会忽略它们。我会将我的代码转换为 Fragment,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多