this.Touch — событие срабатывает несколько раз, не знаю, как отписаться

Эта задача должна быть довольно простой (я думаю), но я не знаю, как это сделать правильно. Я все еще очень новичок в программировании.

У меня есть простой класс, который наследуется от EditText. Есть 2 проблемы:

  1. Изначально событие Touch срабатывает 3 раза, второе касание срабатывает 5 раз и так далее. Что здесь происходит?
  2. Я не знаю, как отписаться от события или на каком этапе. Обычно при работе с активностью я просто подписываюсь во время OnResume и отписываюсь во время OnPause. Какое правильное решение в этом случае? Должен ли я написать собственный метод и вызывать его из родительского класса? Должен ли я реализовать IDisposable или что-то подобное? Должен ли я написать класс по-другому?

Это мой пользовательский демонстрационный класс редактирования текста:

    namespace HelloWorld_Android {
        class DemoEditText : EditText {
            public DemoEditText (Context context, IAttributeSet attrs) : base(context, attrs) {
                this.Touch += HandleTouch;
            }

            void HandleTouch (object sender, TouchEventArgs e) {
                Console.WriteLine ("Fired");
            }
        }
    }

Активность:

    namespace HelloWorld_Android {
        [Activity (Label = "HelloWorld_Android", MainLauncher = true)]
        public class MainActivity : Activity {
            protected override void OnCreate (Bundle bundle) {
                base.OnCreate (bundle);
                SetContentView(Resource.Layout.Main);
            }
        }
    }

Мой XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <HelloWorld_Android.DemoEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/test"
         />
    </LinearLayout>

person Gerhard Schreurs    schedule 19.07.2014    source источник


Ответы (2)


Согласно этой документации, View.Touch предназначен для сенсорных события.

Я бы допросил TouchEventArgs, с которым вызывается ваш обработчик, чтобы узнать, какой конкретный жест он получает. Как минимум, я ожидаю, что он получит два вызова — по одному для начала и конца сенсорного жеста.

person manadart    schedule 22.07.2014
comment
Итак, я какое-то время не работал над этим проектом и установил между ними несколько обновлений xamarin.android. Сегодня я снова запустил проект, код не изменился, и событие касания запускается только дважды, как должно (как вы упомянули), а не срабатывает все больше и больше раз при каждом новом касании. Я не уверен, но думаю, что эта проблема возникла из-за ошибки с сенсорными событиями в xamarin.android, которая была исправлена. - person Gerhard Schreurs; 28.07.2014

Эта проблема исправлена, но код не изменился. Я думаю, это произошло из-за какой-то ошибки в xamarin.android 4.12, на данный момент я использую Xamarin.Android 4.12.6. У меня были и другие (не связанные) проблемы с WebConnectionStream.WriteRequestAsync (исправлено в 4.12.6), возможно, что-то еще пошло не так, что вызвало утечку памяти (не удаляя сенсорный делегат) или что-то еще, не уверен.

person Gerhard Schreurs    schedule 28.07.2014