我有一个扩展 Spinner 的自定义视图类。当用户进行选择时,我试图弄清楚与嵌入的 Activity 对话的正确方法是什么。我看到OnItemSelected
侦听器获得了对适配器的引用,但我不清楚我是否应该使用这个适配器并以某种方式向上走它的父链,或者我是否应该直接与上下文交谈(出于某种原因这感觉不安全,即使我想不出它可能会失败的方式,即兴发挥)。
4 回答
正确的方法是通过公开一个接口来“监听”您的自定义视图,您的视图持有对他的实例的引用,并且您应该实现托管活动。与 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 对话的正确方法是什么。
您不想“与它嵌入的 Activity 交谈”。您想与负责View
. 今天,这可能是一个Activity
. 明天,那可能是一个Fragment
.
我看到 OnItemSelected 侦听器获得了对适配器的引用,但我不清楚我是否应该使用这个适配器并以某种方式向上走它的父链
这意味着View
知道 的特定类型Adapter
,因为Adapter
接口没有任何类型的getContext()
方法。此外,它会将您与与 交谈联系起来Activity
,如上所述,目前这不是一个好计划。
就个人而言,我对Spinner
首先拥有一个自定义子类有点怀疑。但是,假设有充分的理由,您应该遵循 Tal Kanel 的建议(在我写这篇文章时发布)并为您的 custom 声明的这个自定义事件设计一个自定义侦听器接口View
。让控制器(Activity
或Fragment
)提供该接口的实现——这可以直接在控制器上实现,或者实现为匿名内部类(如 Tal Kanel 的回答)等View
。在侦听器接口根据需要。
一个简单的解决方案 -
((ParentClass) context).functionToRun();
其中 ParentClass 是活动的类名。
正确的方法是使用某种监听器。我认为您可以直接参考,然后您的代码将不能用于另一个项目...