从自定义视图到其所在活动的正确沟通方式是什么?

我有一个扩展微调的自定义视图类。 我试图找出当用户做出select时,与embedded的活动交谈的正确方式是什么。 我发现OnItemSelected监听器获得对Adapter的引用,但是我不清楚我是否应该使用这个适配器,并以某种方式走上它的父链,或者我应该直接与上下文交谈(对于一些即使我不能想到一个可能会失败的方法,也不安全。

Solutions Collecting From Web of "从自定义视图到其所在活动的正确沟通方式是什么?"

正确的做法是,通过暴露一个界面来“倾听”您的自定义视图,您的视图持有对他的实例的引用,并且您的主机活动应该执行。 与OnItemSelected界面完全一样,并且已经实现了Android视图公开的任何事件。 这是观察者的devise模式。

例如:

 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 } }); 

我试图找出当用户做出select时,与embedded的活动交谈的正确方式是什么。

您不想“与其embedded的活动交谈”。 您想与负责View的控制器交谈。 今天,这可能是一个Activity 。 明天,这可能是一个Fragment

我看到OnItemSelected监听器获得对适配器的引用,但我不清楚我是否应该使用此适配器,并以某种方式走上其父链

这意味着View知道Adapter的具体types,因为Adapter接口没有任何types的getContext()方法。 而且,它与你谈话的Activity ,这是不是一个好的计划在这一点上,如上所述。

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

简单的解决scheme –

 ((ParentClass) context).functionToRun(); 

其中ParentClass是活动的类名称。

正确的方法是使用某种types的侦听器。 我认为你可以直接参考,你的代码将不能再用于另一个项目,然后…