2

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.

Googleが推奨する方法以外に、この方法の背後に問題はありますか?たとえば、getActivitynull を返すことさえできますか?

4

2 に答える 2

2

2 番目の方法で問題ないはずです。最初の方法は基本的に「ショートカット」であり、アクティビティgetActivity()が使用されるたびに「フェッチ」するのではなく、ローカル変数にアクティビティを格納します。

于 2013-03-18T08:55:43.163 に答える
1

公式の方法の利点は、アクティビティがインターフェイスを実装することを保証する必要があるコード内の場所が 1 つしかないことです。2 番目のアプローチでは、任意の を回避したい場合は、すべてのメソッド呼び出しの後にClassCastExceptionsClassCastExceptionsをキャッチする必要があります。

私も 2 番目のアプローチを頻繁に (問題なく) 使用しましたが、特に多数のメソッド呼び出し、多数のインターフェイス、またはパーツ (フラグメントとアクティビティ) が異なるチーム。

于 2013-03-18T09:16:35.280 に答える