我们都同意使用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 Framework和getActivity()调用的性质,我找不到更好的解决方案.也许有人可以帮助一些输入..
注意:我添加了一个界面来跟随访问者模式.请注意,我仍然必须使用instanceOf来确保父活动正在实现它.
谢谢 .
Gaspar de Elais
你是对的,最好在你的界面中定义一个接口Fragment
并要求Activity
实现它.然后,在onAttach()
你的演员阵容中,你投入Activity
a接口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"); } } }
事实上,这是Fragment
Android主开发者网站上此页面中推荐/描述的内容:http://developer.android.com/training/basics/fragments/communicating.html