Каков правильный способ связи с пользовательским представлением на активность, в которой он находится?

У меня есть собственный класс View, который расширяет Spinner. Я пытаюсь выяснить, какой правильный способ поговорить с Activity, в который он встроен, – когда пользователь делает выбор. Я вижу, что прослушиватель OnItemSelected получает ссылку на Адаптер, но я не знаю, должен ли я использовать этот адаптер и каким-то образом OnItemSelected к его родительской цепочке, или просто поговорить напрямую с контекстом (для некоторых Разум, который не чувствует себя в безопасности, хотя я не могу придумать способ, которым он может потерпеть неудачу, небрежно).

Правильный способ сделать это – «послушать» свое пользовательское представление, выставляя интерфейс, который ваш взгляд имеет ссылку на экземпляр его, и вы должны выполнять хостинг-деятельность. Точно так же, как интерфейс OnItemSelected, и любые события, которые демонстрируют представления андроидов. Это шаблон проектирования наблюдателя.

например:

 public class MyCustomSpinner extends Spinner { public MyCustomSpinner(Context context) { super(context); // TODO Auto-generated constructor stub } public interface IMyEventListener { public void onEventAccured(); } private IMyEventListener mEventListener; public void setEventListener(IMyEventListener mEventListener) { this.mEventListener = mEventListener; } protected void someMethodWhichDoingSomthingAndShouldRaiseAlsoTheEvent() { /* * Some Code which the function doing //more code... */ if (mEventListener != null) { mEventListener.onEventAccured(); } } } 

Это то, как вы будете использовать его из своей деятельности:

  mMyCustomSpinner.setEventListener(new IMyEventListener() { @Override public void onEventAccured() { // TODO Auto-generated method stub } }); 

Я пытаюсь выяснить, какой правильный способ поговорить с Activity, в который он встроен, – когда пользователь делает выбор.

Вы не хотите «разговаривать с деятельностью, в которую она встроена». Вы хотите поговорить с диспетчером, ответственным за View . Сегодня это может быть Activity . Завтра это может быть Fragment .

Я вижу, что прослушиватель OnItemSelected получает ссылку на Адаптер, но я не понимаю, должен ли я использовать этот адаптер и как-то подходить к его родительской цепочке

Это означает, что View знает определенный тип Adapter , так как интерфейс Adapter не имеет никакого метода getContext() . Более того, он связывает вас с разговорами с Управлением, что на данный момент не является хорошим планом, как упомянуто выше.

Лично я немного сомневаюсь в том, что у меня есть собственный подкласс Spinner . Но, полагая, что для этого есть веская причина, вы должны следовать советам Таля Канеля (опубликовано в то время, когда я писал это), и создать пользовательский интерфейс слушателя для этого настраиваемого события, которое объявляется вашим пользовательским View . Попросите контроллер ( Activity или Fragment ) реализовать этот интерфейс – это может быть непосредственно реализовано на контроллере или реализовано как анонимный внутренний класс (как в ответе Таля Канеля) и т. Д. У вас есть собственный метод вызова View ) По интерфейсу слушателя по мере необходимости.

Простое решение –

 ((ParentClass) context).functionToRun(); 

Где ParentClass – это имя класса.

Правильный способ – использовать какой-то прослушиватель. Я думаю, вы можете сделать прямую ссылку, ваш код просто не будет повторно использоваться для другого проекта, тогда …