OnTouchListener不适用于相对布局

时间:2012-06-24 20:12:37

标签: java android

我有RelativeLayout,其中我动态添加了许多TextViews。我面临的问题是,每当我将onTouch监听器单独应用于TextViews时,它会检测到触摸,但是当我为相对布局添加触摸时,它永远不会响应。

此代码检测触摸事件就好了:

TextView tv = new TextView(this);
tv.setText(values[i]);
Drawable d = getResources().getDrawable(R.drawable.level_small_corners);

tv.setClickable(true);
tv.setId(i+1);
tv.setTextSize(18);
tv.setOnTouchListener(cellTouch);

但是当我在myRelativeLayout中添加所有这些TextView时:

myRelativeLayout.setOnTouchListener(cellTouch);

现在,onTouchListener永远不会被调用。为什么会这样?

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

    <ScrollView 
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content"
             android:layout_below="@+id/levelFirstLayout"
             android:layout_marginBottom="70dp"
             > 

        <RelativeLayout  

             android:id="@+id/wordsRelativeLayout"
             android:layout_width="fill_parent" 
             android:clickable="true"   
             android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

            >
        </RelativeLayout>

        </ScrollView> 
    .
    .
    .
        </RelativeLayout>

6 个答案:

答案 0 :(得分:18)

在myRelativeLayout.xml中添加:

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

答案 1 :(得分:14)

这对我有用:

yourRelativeLayout.setOnTouchListener(new View.OnTouchListener() {  
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        //gesture detector to detect swipe.
        gestureDetector.onTouchEvent(arg1);
        return true;//always return true to consume event
    }
});

答案 2 :(得分:7)

tv.setClickable(true);

导致你的布局,而不是触发触摸事件。尝试删除它。

答案 3 :(得分:3)

您的视图中的某些内容可能是myRelativeLayout的“顶部”。如果是,它首先获得触摸事件。最糟糕的是,事件的默认处理是对事件不做任何事情然后消耗它。

一种解决方案是将此代码添加到显示器的任何组件上方“应该处理事件的视图(或布局)”上方:

someView.setOnTouchListener (new View.OnTouchListener()
{
    @Override
    public boolean onTouch (View v, MotionEvent event)
    {
        return false;
    }
});

密钥(显然)是返回false。当你这样做时,事件不会被消耗,而是被“向下”传递给相对布局中的某个东西 - 希望你想要它去的地方。

答案 4 :(得分:1)

我知道这不是你的问题的解决方案,但你的问题是最接近我的问题,所以也许这会对其他人有所帮助。

即使设计师看起来像这样,但布局并不是&#34;屏幕宽度&#34;实际上有一些设置。

包裹宽度,填充/布局中没有点击事件

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

或者,填充/布局中没有点击事件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="0dip"
            android:layout_height="fill_parent"

使用匹配父级,点击事件正在触发

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

答案 5 :(得分:0)

您必须将RelativeLayout设置为此属性为true:android:clickable="true"