2016-08-12 7 views
1

これは可能ですか? I ONATTACH(とフラグメント・アクティビティ・通信の標準的な方法を使用している)と、このような何かを行うことができるかどうか疑問に思って:匿名インタフェースによるアクティビティ通信へのフラグメント

MainActivity.java

// Create Dialog passing in callback 
MyDialogFragment dialog = MyDialogFragment.newInstance(param, new MyDialogInterface) { 
     @Override 
     public void onSelected(DialogFragment dialog, String result) { 

     } 

     @Override 
     public void onNotSelected(DialogFragment dialog) { 

     } 
    } 

MyDialogFragment.java

// Execute callback 
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       myInterface.onNotSelected(MyDialogFragment.this); 
      } 
     }) 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       myInterface.onSelected(MyDialogFragment.this, "WORKED"); 
      } 
     }); 

このようにすれば、ダイアログにコードが追加されるのではなく、ダイアログが表示されるコードでロジックの線形フローを維持できますアクティビティへのods。

答えて

1

これは素晴らしい解決策かもしれないが、ActivityFragmentが破壊され、保存された状態から再作成することができるので、この方式は信頼できません - Fragmentの再作成した後、内部のコールバックへの参照は存在しませんFragment

onAttach()Activityを囲む非null参照してFragmentの再作成後に呼び出されることが保証されているため、onAttach()でコールバックインタフェースへActivityの鋳造を含む標準的な方式では、使用すべきです。これは非常に不便ですが、これはAndroid Framework自体によって課せられた制限です。インタフェースおよび鋳造を含まない

回避策:

、それゆえ、私はあなたが避けたいのですが、「インターフェイスおよびキャスティング」アプローチの多くのバリエーションを試みたが、それらのすべては、確かに汚いと面倒に感じました今日、私はFragmentから-Activityの通信をサポートするためにEventBusを使用します。一般的なスキームのようなもの(図示関連部分のみ)です:

活動:

public class DemoActivity extends Activity { 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     EventBus.getDefault().unregister(this); 
    } 

    @Subscribe 
    public void onDemoFragmentEvent(DemoFragment.DemoFragmentCallbackEvent event) { 
     Toast.makeText(this, "Event in Fragment happened: " + event.getWhatHappened(), Toast.LENGTH_LONG).show(); 
    } 
} 

フラグメント:

public class DemoFragment extends Fragment { 

    /** 
    * Objects of this class will be posted on EventBus if anything happens in this Fragment 
    */ 
    public static class DemoFragmentCallbackEvent { 

     private String mWhatHappened; 

     public DemoFragmentCallbackEvent(String whatHappened) { 
      mWhatHappened = whatHappened; 
     } 

     public String getWhatHappened() { 
      return mWhatHappened; 
     } 
    } 

    public void somethingHappened() { 
     EventBus.getDefault().post(new DemoFragmentCallbackEvent("no interfaces and casting")); 
    } 

} 
+0

はケースだろう気持ちを持っていました。誰かが思いつくような巧妙なハックがあるのだろうかと思っていた。非常に便利だろう! – Ron

+0

@Ron、あなたが "巧妙なハッキング"のためにオープンしているなら、あなたはEventBusに関連する私が使っているアプローチを試してみてください。編集された答えを参照してください。 – Vasiliy

関連する問題