Как вы можете обрабатывать события представления в подклассе, не создавая экземпляры каждого действия? - PullRequest
2 голосов
/ 16 декабря 2011

В моем первом приложении MonoDroid у меня есть подкласс TextView, поэтому я могу отображать рамку вокруг каждого вида ( Android - способ отображения текста с рамками в TextView? ), мне удалось добавить его в мой макет XML( Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML ) и обход вокруг исключений NullReferenceException из-за нижнего регистра MonoDroid для пространств имен Android ( Исключение NullReferenceException при создании пользовательского элемента пользовательского интерфейса Android из подклассированного TextView ).

enter image description here

Сейчас я пытаюсь обработать события касания в каждом BorderedTextView.

Я знаю, что могу получить каждое представление с помощью FindViewById <> и создатьделегат для обработки события Click каждого представления.

BorderedTextView currentDate = FindViewById<BorderedTextView>(Resource.Id.currentdate);
currentDate.Click += delegate {
    Toast toast = Toast.MakeText(this, "CURRENT DATE tapped", ToastLength.Long);
    toast.Show();
}

BorderedTextView startTime = FindViewById<BorderedTextView>(Resource.Id.starttime);
startTime.Click += delegate {
    Toast toast = Toast.MakeText(this, "START TIME tapped", ToastLength.Long);
    toast.Show ();
};

enter image description here enter image description here

Сделав еще один шаг вперед, я могу создать общий метод в BorderedTextView для обработки кликов (но явсе еще приходится создавать экземпляры каждого BorderedTextView).

// In Activity's OnCreate
BorderedTextView currentDate = FindViewById<BorderedTextView>(Resource.Id.currentdate);
currentDate.Click += delegate {
    BorderedTextView.HandleClicks(this);
}

BorderedTextView startTime = FindViewById<BorderedTextView>(Resource.Id.starttime);
startTime.Click += delegate {
    BorderedTextView.HandleClicks(this);
};

// In BorderedTextView
public static void HandleClicks(Context context)
{
    Toast toast = Toast.MakeText(context, "BorderedTextView tapped", ToastLength.Long);
    toast.Show();
}

Поскольку число BorderedTextViews будет варьироваться, и я хотел бы обработатьсобытия click без необходимости создания экземпляров каждого представления в OnCreate действия.Я думал, что смогу что-то сделать в XML-файле макета с атрибутами android: clickable и android: onClick.

<mbta.BorderedTextView
    android:id="@+id/currentdate"
    android:text="CURRENT DATE"
    android:textSize="15pt"
    android:layout_width="fill_parent"
    android:layout_height="75dp"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    android:clickable="true"
    android:onClick="HandleClicks"/>

Но оказывается, что MonoDroid не поддерживает регистрацию событий таким способом ( MonoСобытие Droid onClick не найдено ).

В настоящее время я экспериментировал с SetOnClickListener и событием OnTouchEvent представления без успеха (используя информацию из раздела «События и слушатели» на странице API Design Xamarin *)).

Мне нужен способ обработки каждого события щелчка BorderedTextView с помощью одного метода в классе BorderedTextView без необходимости создания экземпляров каждого представления в OnCreate в Activity.Возможно ли это в MonoDroid или я просто пытаюсь сделать что-то, что инструмент не будет поддерживать в настоящее время.

Заранее спасибо.

Обновление - 12.16.11

* 1040Предложение * jpobst подключить обработчики событий в конструкторах BorderedTextView сработало.
public BorderedTextView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
{
    this.Click += delegate {
        HandleClicks (context);
    };

    this.Tag = this.Text;
}

public BorderedTextView(Context context, IAttributeSet attrs) : base(context, attrs)
{
    this.Click += delegate {
        HandleClicks (context);
    };

    this.Tag = this.Text;
}

public BorderedTextView(Context context) : base(context)
{
    this.Click += delegate {
        HandleClicks(context);
    };

    this.Tag = this.Text;
}

А вот фактический метод для обработки клика

public static void HandleClicks(Context context)
{
    string typeName = ((Type)this.GetType()).Name;
    stirng selected = "Selected " + (string)this.Tag + " (" + typeName + ")";

    Toast.MakeText(context, selected, ToastLength.Short).Show();
}

1 Ответ

3 голосов
/ 16 декабря 2011

Разве вы не можете просто подключить свой обработчик событий в конструкторе BorderedTextView?

...