Android:root视图中的onTouchListener(RelativeLayout)无效

时间:2013-12-09 18:12:37

标签: android touch relativelayout ontouchlistener

我正在开发一个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 。这是为什么?我做错了什么?

谢谢!

2 个答案:

答案 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事件。

我知道这是一个限制性的解决方案,它不能用于复杂的布局,但我可以在我需要的屏幕中使用它。