片段到活动通信的替代方式

时间:2013-03-18 08:46:41

标签: android

请注意,根据http://developer.android.com/training/basics/fragments/communicating.html

,这是FragmentActivity通信的正式方式
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吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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