如何使布局侦听器忽略它上面的视图 - android

时间:2012-06-16 01:03:47

标签: android layout listener android-linearlayout ontouchlistener

我有一个LinearLayout,我想知道用户何时触摸它,并释放了他们的手指。我想我可以通过添加onTouch监听器并检查事件来做到这一点。这个linearLayout拥有一堆按钮。

我的问题不是听众没有工作,只是没有做我认为会做的事情。只有触摸了布局才会激活监听器,这是有道理的,但不是我想要的。如果用户触摸布局内部的按钮,则不会调用布局侦听器,我希望调用它。

这是我的代码:

java代码:

    ll = (LinearLayout)findViewById(R.id.CategorySelect_lLayout_noID);
    ll.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {

            if(event.getAction() == MotionEvent.ACTION_DOWN){
                Toast.makeText(CategorySelect.this, "action DOWN called", Toast.LENGTH_SHORT).show();
                return true;
            } 
            if(event.getAction() == MotionEvent.ACTION_UP){
                Toast.makeText(CategorySelect.this, "action Up called", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

我的xml:

  <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp"
android:scrollbars="none"
 >

    <LinearLayout
        android:id="@+id/CategorySelect_lLayout_noID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <Button
            android:id="@+id/CategorySelect_b_1"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_1"
        />

        <Button
            android:id="@+id/CategorySelect_b_2"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_2" />

        <Button
            android:id="@+id/CategorySelect_b_3"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_3" />

        <Button
            android:id="@+id/CategorySelect_b_4"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_4" />

        <Button
            android:id="@+id/CategorySelect_b_5"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_5" />

        <Button
            android:id="@+id/CategorySelect_b_6"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_6" />

        <Button
            android:id="@+id/CategorySelect_b_7"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_7" />
    </LinearLayout>

</ScrollView>

感谢阅读。

评论的更新代码:

从我的活动中膨胀的主要xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/categoryselect_background"
android:scaleType="fitXY"
 >

<TextView
    android:id="@+id/CategorySelect_tv_chooseacat"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="70dp"
    android:gravity="center"
    android:text="@string/CategorySelect_tv_chooseacat"
    android:textColor="#FF5500"
    android:textSize="34dp"
    android:textStyle="bold" 
    />

<Button
    android:id="@+id/CategorySelect_b_settings"
    android:background="@drawable/menu_settings"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
     />

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp"
android:scrollbars="none"
>

    <com.tdubstudios.soundboard.hungergames.ScrollAbleLinearLayout
        android:id="@+id/CategorySelect_lLayout_noID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <Button
            android:id="@+id/CategorySelect_b_cato"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_1"
        />

        <Button
            android:id="@+id/CategorySelect_b_cinna"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_2" />

        <Button
            android:id="@+id/CategorySelect_b_effie"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_3" />

        <Button
            android:id="@+id/CategorySelect_b_gale"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_4" />

        <Button
            android:id="@+id/CategorySelect_b_haymitch"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_5" />

        <Button
            android:id="@+id/CategorySelect_b_katniss"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_6" />

        <Button
            android:id="@+id/CategorySelect_b_peeta"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_7" />
    </com.tdubstudios.soundboard.hungergames.ScrollAbleLinearLayout>

</ScrollView>
</RelativeLayout>

这是ScrollAbleLinearLayout类:

package com.tdubstudios.soundboard.hungergames;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;

public class ScrollAbleLinearLayout extends LinearLayout {


public ScrollAbleLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    return false; // Tell children not to use this event
}
}

是的我知道有些事情的命名已经改变了我以前的代码,那是因为我改变了它来隐藏我正在制作的应用程序类型(来自搜索结果)。然而无论出于何种原因,我都不在乎,所以这就是背后的原因。

感谢。

第三次编辑:

所以我现在正在使用

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    //requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        return false;
    } 
    if(event.getAction() == MotionEvent.ACTION_UP){
        return false;
    }


    return true; // Tell children not to use this event
}

它按照我想要的方式工作,但这不实用。要实际注册按钮点击,您必须确保不要向左/向右/向上/向下移动手指。它必须完全是向下和完全向上。我试图添加一个onFling方法,然后跟踪手指移动的距离。如果它移动的数量少于x个像素数,那么使main方法返回false,这将允许按钮工作,但如果它实际上是滑动/移动,则按钮不需要被激活。这就是我的意思:

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        if (Math.abs(e1.getY() - e2.getY()) > MORE_THAN_X_INT) {
            booleanVar = false;
            return false;
        }else{
          booleanVar = true;
         }
      return false;
   }

然后做:

Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    //requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        return false;
    } 
    if(event.getAction() == MotionEvent.ACTION_UP){
        return false;
    }


    return booleanVar; // Tell children not to use this event
}

我认为这样可行,但我无法测试它因为没有onFling方法来扩展LinearLayout

有什么建议吗?

请注意我的返回真/假可能会倒退,我不确定这会让我感到困惑。但是,如果有人能够引导我制作onFling方法,我可以随意使用它来获得正确的值。


我有

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    //requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    while(event.getAction() == MotionEvent.ACTION_DOWN){
        return true;
    } 
    while(event.getAction() == MotionEvent.ACTION_UP){
        return true;
    }


    return false; // Tell children not to use this event
}

我的按钮永远不会点击。但是ontouch听众完全可以工作哈哈:|

2 个答案:

答案 0 :(得分:4)

我建议延长LinearLayout并使用onInterceptTouchEvent来捕捉触摸事件,然后返回true以强制其子女不接收事件。

这样的事情:

public class MyLinearLayout extends LinearLayout {
    public MyLinearLayout(Context context) {
        super(context);
    }
    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return true; // Tell children not to use this event
    }
}

然后,在您的XML中,将LinearLayout更改为com.yourpackagename.MyLinearLayout

附录:如果您希望Button LinearLayout收到该事件,您可以更改{{1}对此:

onInterceptTouchEvent

答案 1 :(得分:0)

所以我从未真正找到问题的答案,但我发现了一种有效的方法。我只是为完整的活动而不是特定的视图添加onTouchEvent方法,而不是在布局上放置一个监听器。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        Toast.makeText(CategorySelect.this, "action DOWN called", Toast.LENGTH_SHORT).show();
    } 
    if(event.getAction() == MotionEvent.ACTION_UP){
        Toast.makeText(CategorySelect.this, "action Up called", Toast.LENGTH_SHORT).show();
    }
    return super.onTouchEvent(event);
}

它不影响任何按钮,所以它正是我想要的。非常感谢Soxxeh和我一起工作。