2016-08-12 48 views
1

這可能嗎?我一直在使用與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"); 
      } 
     }); 

這將允許我在顯示對話框的代碼中保持線性流程的邏輯,而不必添加額外的接口方法活動的概念。

回答

1

這可能是一個很好的解決方案,但由於ActivityFragment可以被摧毀,並從保存的狀態重新創建,該方案是不可靠的 - 之後Fragment的再創作會有裏面的回調沒有參考Fragment

標準方案,涉及Activity鑄造成回調接口在onAttach(),應該使用,因爲onAttach()是保證被稱爲後Fragment的重新創建與非空引用,以包圍Activity。這非常不方便,但這是Android Framework本身的限制。

解決方法不涉及接口和鑄造:

我想你想避免的「接口和鑄造」的方法很多變化,和所有的人都感到確實髒,繁瑣,因此,如今,我使用EventBus來支持FragmentActivity的通信。總體方案是這樣的(只顯示相關部分):

活動:

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