2012-02-09 19 views
29

特定の親アクティビティ内でのみフラグメントを使用します。 。フラグメントからのアクティビティメソッドの呼び出し

getActivity()someMethodInParentActivitiy()

より一般的な解決策は、に次のようになります。私はこのような付属の断片から直接親アクティビティのメソッドを呼び出す場合は任意の欠点がある場合今私は疑問に思いますフラグメント内に正式なリスナー・インターフェースを定義して親アクティビティーにコールバックし、アクティビティーでそのインターフェースを実装するようにします。

は、任意の理由(例えば信頼又は速度)なぜ第二のより複雑な溶液の代わりに、直接法は、活性断片からコール使用すべきではありますか?

答えて

21

最初の演奏を見ないでください。 「時期尚早の最適化はすべての悪の根源」であることを忘れないでください。第2のアプローチは、あなたのフラグメントが異なるアクティビティーで使用される可能性があるため、より優れています。最初のアプローチでは、コード内でより多くの依存関係が導入され、フラグメントはアクティビティー・タイプに依存します。あなたはテスト、再利用、小さな複合体の能力を失っています。今より簡単なように見えるかもしれないが、将来的にあなたがやるべきこと;-)

+0

ありがとうございました。私は、getActivity()を使用して直接アクティビティメソッドにアクセスすることは簡単ではないことにも気付きました。おそらく私は追加のキャストが必要でしょうか? – Anguel

+0

'someMethodInParentActivitiy()'を含む実装にうんざりします。しかし、私が書いたように、それは推奨されていません。 – pawelzieba

+0

実際に私はちょっと混乱してしまいました.Diane Hackbornはそのようなメソッドコールを使用するとokです: http://markmail.org/thread/sgvnc7bjtjfbh5rx#query:+page:1+mid:6kakhwquxdigf7om+state:results – Anguel

24

追加キャストが必要表示されます:uはそのフラグメントを使用する場合が@pawelziebaが書いたように

Activity activity123 = getActivity(); 

if(activity123 instanceof ParentActivity) { 
    ((ParentActivity) activity123).someMethodInParentActivity(); 
} 

をおそらくこの方法ではうまくいかない場合もあるでしょう。乾杯。

+0

良い仕事........ !!! –

9

私はこのようなことをする必要があります。私はBroadcastReceiverを使ってどこからでも呼び出すことができます。

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action != null) { 
      if (action.equals("WHATEVER_ACTION")) { 
       // Do stuff 
      } 
     } 
    } 
}; 

はその後、私のフラグメントに私はちょうど使用します。

activity.sendBroadcast(。新しいテント()SetActionは( "WHATEVER_ACTION"));

+1

ベストプラクティスのように見えます。基本的なデザインパターン。 – rwst

+0

放送局をマニフェストに登録するだけで、アクティビティとフラグメントの間の通信に使用する必要がありますか? – Max

関連する問題