2

请注意,这是官方的沟通方式,Fragment根据http://developer.android.com/training/basics/fragments/communicating.htmlActivity

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 吗?

4

2 回答 2

2

第二种方式应该没问题 - 第一种方式基本上是一种“快捷方式”,它将活动存储在局部变量中,而不是getActivity()每次使用时都“获取”它。

于 2013-03-18T08:55:43.163 回答
1

官方方式的一个优点是,您的代码中只有一个位置需要确保活动实现接口。在第二种方法中,如果您想避免 any ,则必须在每次方法调用后ClassCastExceptions捕获ClassCastExceptions 。

虽然我也经常使用第二种方法(没有任何问题),但我可以想象使用 Google 版本是有益的,特别是在许多方法调用、大量接口或相当大的项目中,其中部件(片段和活动)由不同的团队。

于 2013-03-18T09:16:35.280 回答