LinearLayout上的OnTouchListener位于按钮后面

时间:2017-03-22 19:06:47

标签: android android-layout xamarin

我正在使用Xamarin中的C#开发Android应用程序。在我的axml文件中,我有一个具有特定ID的LinearLayout,我已将其分配给onTouchListener。问题是只要我的设计中的按钮位于linearLayout之上,就不会触发onTouchListener。如果我将其中一个按钮设置为不可见,那么它可以正常工作。

即使路上有控件,仍然可以让onTouchListener做出反应吗?

这是我的方法:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:orientation="vertical">
    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:orientation="horizontal"
        android:layout_weight="1">
        <Button
            android:id="@+id/button1"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="1"
            android:layout_marginBottom="0.0dp"
            android:background="@android:color/holo_green_light"
            android:soundEffectsEnabled="false" />
        <Button
            android:id="@+id/button2"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="2"
            android:background="@android:color/holo_blue_light" />
    </LinearLayout>
    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_weight="1">
        <Button
            android:id="@+id/button3"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="3"
            android:background="@android:color/holo_red_light" />
        <Button
            android:id="@+id/button4"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="4"
            android:background="@android:color/holo_orange_light" />
    </LinearLayout>
</LinearLayout>

这就是我为linearLayout设置onTouchlistener的方法:

LinearLayout linLay = FindViewById<LinearLayout>(Resource.Id.LinearLayout1);
linLay.SetOnTouchListener(new MyTouchListener(this));

这是一个自定义触控侦听器类:

    public class MyTouchListener : Java.Lang.Object, View.IOnTouchListener
    {
    Context activityContext;

    public MyTouchListener(Context ac)
    {
        activityContext = ac;
    }

    public bool OnTouch(View v, MotionEvent e)
    {
        float x = 0.0f;
        float y = 0.0f;

        if (e.Action == MotionEventActions.Down)
        {
            // do stuff

            x = e.GetX();
            y = e.GetY();

            Toast.MakeText(activityContext, x.ToString(), ToastLength.Short).Show();


            return true;
        }
        //if (e.Action == MotionEventActions.Up)
        //{
        //    // do other stuff
        //    return true;
        //}
        return true;
    }
}

最后,这就是我设置按钮点击监听器的方式:

        Button button = FindViewById<Button>(Resource.Id.button1);
        button.Click += (s,e) =>
        {
            //int i = count % s.Count;
            //if(i > 28)
            //    Toast.MakeText(this, button.GetX().ToString(), ToastLength.Short).Show();

            button.Text = string.Format("{0}", count++);

        };

2 个答案:

答案 0 :(得分:2)

您必须拦截触摸事件。为此,您必须继承LinearLayout并覆盖onInterceptTouchEvent()

public class MyLinearLayout extends LinearLayout {
    public MyLinearLayout(Context context) {
        super(context);
    }

    public MyLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(getContext(), "onTouch", Toast.LENGTH_SHORT).show();
        return true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return true;
    }
}

您的xml

<?xml version="1.0" encoding="utf-8"?>
<com.your.package.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/LinearLayout1"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              android:orientation="vertical">
    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:orientation="horizontal"
        android:layout_weight="1">
        <Button
            android:id="@+id/button1"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="1"
            android:layout_marginBottom="0.0dp"
            android:background="@android:color/holo_green_light"
            android:soundEffectsEnabled="false" />
        <Button
            android:id="@+id/button2"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="2"
            android:visibility="invisible"
            android:background="@android:color/holo_blue_light" />
    </LinearLayout>
    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_weight="1">
        <Button
            android:id="@+id/button3"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="3"
            android:background="@android:color/holo_red_light" />
        <Button
            android:id="@+id/button4"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="4"
            android:background="@android:color/holo_orange_light" />
    </LinearLayout>
</com.your.package.MyLinearLayout>

现在,布局上的任何触摸事件都将由您的自定义MyLinearLayout处理。

答案 1 :(得分:0)

您需要扩展(固有)父线性布局,以便您可以拦截嵌套子布局中的触摸事件。覆盖这两种方法以接收来自孩子的触摸。然后在您的xml中,您将添加“myCustomLinearLayout”或您为自定义线性布局类命名的任何内容。它应该与C#/ Xamarin非常相似。

@Override
   public boolean onInterceptTouchEvent(MotionEvent ev) {
     return true; // With this i tell my layout to consume all the touch events from its childs
  }

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    // Log.d(TAG, String.format("ACTION_DOWN | x:%s y:%s", 
        break;
    case MotionEvent.ACTION_MOVE:
    //Log.d(TAG, String.format("ACTION_MOVE | x:%s y:%s", 
        break;
    case MotionEvent.ACTION_UP:
        break;
    }
    return true;
}