17

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

此代码可以很好地检测触摸事件:

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" > 

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

        </RelativeLayout>

    </ScrollView> 
    .
    .
    .
</RelativeLayout>
4

6 回答 6

18

在 myRelativeLayout.xml 添加:

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
于 2012-06-24T20:16:23.377 回答
15

这对我有用:

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
    }
});
于 2012-09-20T08:25:46.277 回答
7
tv.setClickable(true);

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

于 2012-06-25T02:38:50.107 回答
3

您认为某些东西可能位于 myRelativeLayout 的“顶部”。如果是,它首先获得触摸事件。最糟糕的是,事件的默认处理是对事件不做任何事情,然后使用它。

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

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

关键(显然)是返回 false。当您这样做时,该事件将不会被消耗,而是“向下”传递到您的相对布局中的某些东西——希望它是您希望它去的地方。

于 2012-09-28T13:16:10.777 回答
1

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

尽管在设计器中看起来是这样,但在某些设置下,布局实际上并不是“屏幕宽”。

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

<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"
于 2015-11-26T19:54:37.750 回答
0

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

于 2012-06-24T20:14:20.707 回答