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

Gen*_* S. 13 android view adapter spinner android-context

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

Tal*_*nel 32

正确的方法是通过公开一个界面来"监听"你的自定义视图,你的视图包含对他的实例的引用,你应该实现托管活动.与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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

            mMyCustomSpinner.setEventListener(new IMyEventListener() {

                @Override
                public void onEventOccurred() {
                    // TODO Auto-generated method stub

                }
            });
Run Code Online (Sandbox Code Playgroud)


Com*_*are 5

当用户做出选择时,我正在试图找出与嵌入的Activity对话的正确方法.

你不想"与它嵌入的活动对话".你想和负责的控制器交谈View.今天,那可能是一个Activity.明天,那可能是一个Fragment.

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

这意味着View知道特定的类型Adapter,因为Adapter接口没有任何getContext()方法.而且,Activity如上所述,它将你与之交谈,这在这一点上不是一个好的计划.

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

  • @Drdel博士:"或者出于某种原因不建议这样做?" - 这是我答案的关键.Tal Kanel的答案和MisterSquonk的评论都反映了这一点.此时,您有三个人告诉您为自定义"View"创建自定义事件的自定义侦听器界面.无论你是在`Activity`上实现这个监听器接口,还是在其他东西上,`Activity`都是自定义的`View`,这取决于你. (2认同)