我们都同意使用instanceOf通常不是最好的解决方案。网上有很多例子。
但让我们考虑一下下面的例子,我们需要调用一个从片段到其活动的方法:
public class BaseActvity extends FragmentActivity implements ISomething {
@Override
public void doSomething();
}
然后假设我们在应用程序中有一个片段需要调用doSomething()
:
public MyFragment extends Fragment() {
public void onCreate() {
public void onResume() {
Activity activity = getActivity();
if (activity != null && activity instanceOf ISomething) {
ISomething something = (ISomething) activity;
something.doSomething();
}
}
}
public interface ISomething {
void doSomething();
}
正如您所看到的,我们不能保证getActivity()将返回ISomething的对象,所以我们检查类型。一个改进是添加一个接口,但我们仍然需要检查getActvity()返回类型来保护我们的代码。
由于Android框架和getActivity()调用的性质,我找不到更好的解决方案。也许有人可以提供一些意见。。
注意:我添加了一个界面来遵循访问者模式。注意,我仍然需要使用instanceOf来确保父活动正在实现它
谢谢。
Gaspar de Elais
你是对的,最好在Fragment
中定义一个接口,并要求Activity
实现它。然后,在onAttach()
中,你将Activity
强制转换为try/catch
中的接口,如果它抛出ClassCastException
,你可以抛出自己的异常。
public MyFragment extends Fragment {
private Callback mCallback;
public interface Callback {
void doSomething();
}
...
@Override
public void onAttach(Activity activity) {
try {
mCallback = (Callback)activity;
} catch (ClassCastException e) {
throw new IllegalArgumentException("Activity must implement Callback");
}
}
}
事实上,这就是Android开发者主网站上Fragment
页面中推荐/描述的内容:http://developer.android.com/training/basics/fragments/communicating.html
您可以查看访问者模式。这里有一个解释和一些Java代码。