请注意,根据http://developer.android.com/training/basics/fragments/communicating.html
,这是Fragment
与Activity
通信的正式方式
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
mCallback.onArticleSelected(position);
}
}
但是,我遇到了执行以下技术的代码。
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
((OnHeadlineSelectedListener)this.getActivity()).onArticleSelected(position);
}
到目前为止我测试过,即使在配置更改后,我仍然可以获得最新的Activity
。
我只是想知道,除了谷歌推荐的方法之外,这种方法背后有什么问题吗?例如,getActivity
甚至可以返回null吗?
答案 0 :(得分:2)
第二种方式你应该没问题 - 第一种方式基本上是一种“快捷方式”,它将活动存储在局部变量中,而不是每次使用时都通过getActivity()
“取出”它。
答案 1 :(得分:1)
官方方式的一个优点是,您的代码中只有一个位置,您需要确保该活动实现接口。在第二种方法中,如果要避免任何ClassCastExceptions
,则必须在每次方法调用后捕获 ClassCastExceptions 。
虽然我也经常使用第二种方法(没有任何问题),但我可以想象,特别是在许多方法调用,大量接口或大部分项目中使用Googles版本是有益的(片段和活动)由不同的团队提供。