【问题标题】:onTouchListener not working after layout changeonTouchListener 在布局更改后不起作用
【发布时间】:2017-12-29 23:58:26
【问题描述】:

我想在用户在屏幕上的任意位置滑动时获得反馈。我发现了一些使用 onTouchListener 的代码。它奏效了。 今天我对我的 UI 设置进行了一些修改,并添加了许多新的布局以更好地组织它。但是我的 onTouch 事件再也不会触发了!

我的猜测是某些布局可能会重叠并窃取事件。但我没有成功尝试在 xml 中使用以下参数。

android:clickable="false"
android:focusable="false"
android:touchscreenBlocksFocus="false"
android:visibility="invisible"

这是在 onCreate 中运行的代码:

View window = getWindow().getDecorView();
window.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        System.out.println("YEY! A TOUCH EVENT!");
        return true;
    }
});

RelativeLayout tab1 = (RelativeLayout) findViewById(R.id.layTab1);
tab1.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        System.out.println("YEY! A TOUCH EVENT!");
        return true;
    }
});

任何关于添加新布局时可能发生变化的想法都非常受欢迎!

【问题讨论】:

    标签: android-layout android-studio ontouchlistener


    【解决方案1】:

    您可以尝试使用 frame layout 创建布局设计 如下图:

    <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <View
            android:id="@+id/view_main"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:scaleType="matrix"/>
    
    //Your Layout design
    
    </FrameLayout>
    

    并在代码中制作 view_main .setOnTouchListner.. 其他布局设计现在无法通过这种方式窃取 touchlistner 事件..

    findViewById(R.id.view_main).setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            System.out.println("YEY! A TOUCH EVENT!");
            return true;
        }
    });
    

    我希望这可以帮助你。让我知道结果。

    【讨论】:

    • 感谢您的建议。在我设法找到有关 ScrollView 的一些信息之前,我从来没有尝试过。所以我不知道它是否会起作用。但鉴于我对 ScrollViews 的发现,我确实觉得这不太可能。
    【解决方案2】:

    经过多次故障排除后,我终于弄清楚了问题所在。 我的布局层次结构如下:

    - activity_main (RelativeLayout)
    --- layTab1 (RelativeLayout)
    ----- (ScrollView)
    ------- layTab1View (LinearLayout)
    --------- (STUFF FOR THIS TAB)
    --- layTab2 (RelativeLayout)
    ----- (ScrollView)
    ------- layTab2View (LinearLayout)
    --------- (STUFF FOR THIS TAB)
    

    我试图从activity_main 布局中获取事件。在我添加ScrollView 之前,它工作得很好。显然,ScrollView 消耗了所有的触摸事件。要解决此问题。我必须为ScrollView 的所有LinearLayout 子级添加一个侦听器,因为当时只有一个选项卡处于活动状态。

    我怎么觉得让多个不同的元素监听同一个事件来触发菜单弹出有点不必要?因此,如果可能的话,我很想听听关于如何更“干净”地解决这个问题的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多