新的android了解listener =(OnItemSelectedListener)活动

时间:2013-12-25 16:04:31

标签: java android android-fragments

我正在阅读vogella的教程并遇到了这段代码:

public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnItemSelectedListener) {
listener = (OnItemSelectedListener) activity;
} else {
throw new ClassCastException(activity.toString()+ " must implemenet MyListFragment.OnItemSelectedListener");
}
}

我不确定它的作用。这就是我所知道的:

我知道当片段与活动相关联时会调用onAttach。 我知道OnItemSelectedListener是一个接口 我知道它检查活动是否正确实现了此接口,但不确定以下代码的作用:listener =(OnItemSelectedListener)activity

我理解的是它的类型将它转换为OnItemSelectedListener ......但它还能做什么?

2 个答案:

答案 0 :(得分:0)

在类声明中指定了接口。 Activity类可以扩展Activity并实现OnItemSelectedListener

public class MyActivity extends Activity implements OnItemSelectedListener { }

在调用Activity时,代码只知道它是onAttach类型,但您想要 OnItemSelectedListener,因此您需要投射活动。这就是listener = (OnItemSelectedListener)activity代码的作用,它会转换实例活动。因此,为了避免泛型ClassCastException,首先执行检查,如果活动的类型不正确,则抛出具有更具体错误文本的异常。

没有什么特别的特殊功能,使用cast可以调用该接口中定义的方法。你没有得到任何新的实例或东西,监听器和活动是同一个对象。

答案 1 :(得分:0)

在你在vogella上阅读的教程项目之外,它实际上是无用的。此代码特别检查尝试与父活动关联的FragmentActivity是否实现OnItemSelectedListener,以及它执行此操作的原因是因为如果某个操作未实现{{1的所有属性它附加到OnItemSelectedListener它将引发异常,因为Dalvik虚拟机将无法正确处理执行该特定操作的请求。 以下一行:

AdapterView

将类型为litener = (OnItemSelectedListener) activity; 的对象转换为类型为FragmentActivity的对象,并将该值复制到OnItemSelectedListener变量,该变量很可能是实现{{1}的类的属性有问题的方法。