当用户在屏幕上的任何位置滑动时,我想获得反馈。我找到了一些使用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;
}
});
关于添加新布局时可能发生的变化的任何想法都非常感谢!
您可以尝试使用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 .setOnTouchListener。其他布局设计现在无法通过这种方式窃取touchlistener事件..
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;
}
});
我希望这可以帮助你。让我知道结果。
经过多次故障排除后,我终于弄明白了问题是什么。我的布局层次结构如下:
- 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
消耗所有触摸事件。解决这个问题。我必须为LinearLayout
的所有ScrollView
孩子添加一个监听器,因为当时只有一个选项卡处于活动状态。
我觉得有多个不同的元素听同一事件来触发菜单弹出有点不自觉?所以,如果可能的话,我很想听听关于如何更“干净”地解决这个问题的建议。