我有一个自定义的View类,它继承了Spinner。当用户进行选择时,我试图找出与其嵌入的Activity交互的正确方式。我发现OnItemSelected
监听器可以获得对Adapter的引用,但我不确定是否应该使用此Adapter并在其父级链上进行操作,还是直接与上下文通信(尽管我无法立即想到任何可能失败的情况,但这种方法似乎不安全)。
我有一个自定义的View类,它继承了Spinner。当用户进行选择时,我试图找出与其嵌入的Activity交互的正确方式。我发现OnItemSelected
监听器可以获得对Adapter的引用,但我不确定是否应该使用此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
}
});
AdapterView
有一个索引和一个Adapter
。Adapter
适配Object
,而不是String
。当然,你可以有一个适配String
、Video
、Restaurant
、ResolveInfo
或其他任何东西的Adapter
。AdapterView
(其中包括Spinner
)与String
无关。 - CommonsWareView
的自定义事件创建一个自定义监听器接口。无论你将此监听器接口实现在Activity
上还是在Activity
传递给自定义View
的其他东西上,都由你决定。 - CommonsWareAdapterView
的工作方式。我从未见过任何一个例子,有人会为了避免创建“适配器”而子类化 Spinner
这样的东西。 - CommonsWare正确的方法是使用某种监听器。我认为你可以直接引用,但你的代码就不能在另一个项目中重复使用了...
Activity
有责任知道它想要做什么,并相应地采取行动。 - Squonk((ParentClass) context).functionToRun();
其中ParentClass是该活动的类名。