从自定义视图与其所在的活动进行通信的正确方法是什么?

我有一个扩展Spinner的自定义View类。 我试图弄清楚当用户做出选择时,与嵌入的Activity对话的正确方法是什么。 我看到OnItemSelected侦听器获取了对Adapter的引用,但是我不清楚我是否应该使用这个适配器并以某种方式向上移动它的父链,或者我是否应该直接与上下文对话(对于某些感觉不安全的原因,即使我想不出它可能会失败的方式,但是。

正确的方法是通过公开一个界面来“监听”你的自定义视图,你的视图包含对他的实例的引用,你应该实现托管活动。 与OnItemSelected接口完全一样,并且已经实现了android视图所暴露的任何事件。 这是观察者的设计模式。

例如:

 public class MyCustomSpinner extends Spinner { public MyCustomSpinner(Context context) { super(context); // TODO Auto-generated constructor stub } public interface IMyEventListener { public void onEventOccurred(); } 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.onEventOccurred(); } } } 

这是你将如何在你的活动中使用它:

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

我试图弄清楚当用户做出选择时,与嵌入的Activity对话的正确方法是什么。

你不想“与它嵌入的活动对话”。 您想与负责View的控制器交谈。 今天,这可能是一项Activity 。 明天,那可能是Fragment

我看到OnItemSelected侦听器获取对Adapter的引用,但是我不清楚我是否应该使用这个适配器并以某种方式向上移动其父链

这意味着View知道Adapter的特定types,因为Adapter接口没有任何types的getContext()方法。 此外,如上所述,它将您与Activity ,这在这一点上不是一个好的计划。

就个人而言,我有点怀疑自己有一个自定义Spinner子类。 但是,假设它有充分的理由,你应该遵循Tal Kanel的建议(在我写这篇文章的时候发布)并为你的自定义View声明的这个自定义事件设计一个自定义监听器接口。 让控制器( ActivityFragment )提供该接口的实现 – 这可以直接在控制器上实现,或者实现为匿名内部类(如Tal Kanel的答案)等。拥有自定义View调用方法(s )根据需要在监听器接口上。

简单的解决方案 –

 ((ParentClass) context).functionToRun(); 

其中ParentClass是活动的类名。

正确的方法是使用某种types的监听器。 我想你可以直接引用,你的代码就不能再用于另一个项目……