我正在开发一个Android
应用,我正试图在整个屏幕中捕获OnTouch
events
。我的所有activities
都会有一个包含两个buttons
的标题,然后是一个将要更改的正文。
在Activity
我正在测试的身体是ListView
,因此Activity
有:
- 屏幕顶部的两个Buttons
。
- ListView
在这两个按钮下。
我想在整个屏幕中捕获onTouchEvents
。我尝试将OnTouchListener
设置为我的根RelativeLayout
并将clickable = false和focusable = false设置为所有其他视图,但它不起作用: onTouch事件仅在我单击时触发第一个按钮。
这是我的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
tools:context=".MainActivity" >
<include
layout="@layout/header"
android:clickable="false"
android:focusable="false" />
<ListView
android:id="@+id/lvLocations"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/header_layout"
android:clickable="false"
android:focusable="false" />
</RelativeLayout>
这是@ layout / header的内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/header_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:weightSum="5" >
<Button
android:id="@+id/homeButton"
android:layout_width="0dip"
android:layout_height="50dp"
android:layout_marginRight="5dp"
android:layout_weight="4"
android:clickable="false"
android:focusable="false"
android:onClick="Home"
android:text="@string/home" />
<ImageButton
android:id="@+id/speechButton"
android:layout_width="0dip"
android:layout_height="50dp"
android:layout_weight="1"
android:clickable="false"
android:focusable="false"
android:onClick="ClickMediaButton"
android:src="@drawable/micro" />
</LinearLayout>
这是我正在使用的代码:
findViewById(R.id.root).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("MACT", "TOUCH!");
}
});
就像我说的那样,我的日志仅在单击homeButton时显示TOUCH 。这是为什么?我做错了什么?
谢谢!
答案 0 :(得分:0)
为什么不为您的RelativeLayout
创建一个捕捉触摸事件的自定义视图,然后您可以随意使用它?
public class CustomRelativeLayout extends RelativeLayout{
CustomRelativeLayout(Context context, AttributeSet attrs){
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent ev){
//handle touch event
return true;
}
}
然后,您可以通过在项目命名空间中查找该类来在XML中使用此相对布局。你当然可以添加你想要的任何修改器,但这里是一个它的样子的例子。
<com.example.whatever.your.project.CustomRelativeLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
一旦你抓住了触摸,你可以用它做任何你想做的事。您可以将其传递给其他活动,您可以使用它来调用其他方法等。有关如何使用自定义视图see this部分Android文档的更多信息。
答案 1 :(得分:0)
我终于设法解决了,为了做到这一点,我重新设计了我的布局。现在我没有标题和ListView,而是在我的布局中只有一个ListView:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myList"
android:layout_width="match_parent"
android:layout_height="match_parent" />
然后我将标题布局添加到ListView:
View header = (View)getLayoutInflater().inflate(R.layout.header,null);
mList.addHeaderView(header);
现在我将onTouchListener设置为ListView和voilà,我在整个屏幕上收到onTouch事件。
我知道这是一个限制性的解决方案,它不能用于复杂的布局,但我可以在我需要的屏幕中使用它。