2014-09-22 106 views
0

我有拿下3個不同片段的片段容器,我想3個片段什麼是碎片

什麼是做到這一點的最佳方式之間通知消息之間的溝通的最佳方式?

由於

+0

請參閱:與其他片段進行通信 - http://developer.android.com/training/basics/fragments/communicating.html – reVerse 2014-09-22 14:04:33

+0

唯一的原因是通過活動進行通知? – 2014-09-22 14:40:17

回答

0

保持在活動的公共變量(如果小數據),或者,寫入活動的接口並執行,在所有片段。使用接口通過寫入方法傳遞數據。

+0

但是,根據你的解決方案,這意味着我需要保存一個活動參考,它可能是一個潛在的內存泄漏錯誤 – 2014-09-22 14:08:49

0

你在這裏。這是做分段< - >活動交流的正確和完整的方式。片段< - >片段通信應該通過控制它們的活動。我添加了相關的接口,與onBackPress爲例:

public class BaseFragment extends Fragment implements BaseActivityDelegate { 

    private BaseActivityInterface mActivity; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     if (mActivity != null) { 
      mActivity.registerBaseActivityDelegate(this); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mActivity != null) { 
      mActivity.unregisterBaseActivityDelegate(this); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mActivity = (BaseActivityInterface)activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() +" must implement BaseActivityInterface"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mActivity = null; 
    } 

    /** 
    * Override by sub-class in order to intercept the back press. 
    * 
    * @return true if the back press is consume by the fragment 
    */ 
    @Override 
    public boolean onBackPressed() { 
     return false; 
    } 
} 




public class BaseActivity extends FragmentActivity implements BaseActivityInterface { 

    protected ArrayList<BaseActivityDelegate> mBaseActivityDelegates; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.mBaseActivityDelegates = new ArrayList<BaseActivityDelegate>(); 
    } 

    @Override 
    public void registerBaseActivityDelegate(BaseActivityDelegate delegate) { 
     if (mBaseActivityDelegates != null) { 
      mBaseActivityDelegates.add(delegate); 
     } 
    } 

    @Override 
    public void unregisterBaseActivityDelegate(BaseActivityDelegate delegate) { 
     if (mBaseActivityDelegates != null) { 
      mBaseActivityDelegates.remove(delegate); 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     if (mBaseActivityDelegates != null) { 
      for (BaseActivityDelegate delegate : mBaseActivityDelegates) { 
       if (delegate != null && delegate.onBackPressed()) { 
        // the delegate intercepted the back press event 
        return; 
       } 
      } 
     } 
     // back press was not intercepted, continue handling it 
     super.onBackPressed(); 
    } 
} 


public interface BaseActivityDelegate { 
    public boolean onBackPressed(); 
} 

public interface BaseActivityInterface { 
    public void registerBaseActivityDelegate(BaseActivityDelegate delegate); 
    public void unregisterBaseActivityDelegate(BaseActivityDelegate delegate); 

} 
1

最簡單的&最好的辦法將是利用一些事件總線庫。它將保持您的代碼清理片段之間的鬆散耦合通信活動。

奧托非常容易設置&的使用。它來自sqaure。查看@http://square.github.io/otto/

http://corner.squareup.com/2012/07/otto.html也會讓你看到它解決了什麼問題。

+0

尼斯:),它看起來是一個很好的事件處理框架 – 2014-09-22 14:42:53

+0

其良好的做法接受和高票投票答案,如果它已經解決了您的問題 – Akhil 2014-09-22 17:04:45

+0

或者使用https://github.com/greenrobot/EventBus – powder366 2015-05-31 21:08:29