2016-09-10 20 views
3

Observer patternとし、FragmentsActivityで使用するように作成しています。フラグメントが表示されているかどうかを知る方法

Subscribeには、いくつかのフラグメントに関連付けられた複数のリスナーにメソッドがあります。フラグメントが表示されている場合は

私のカスタムイベントリスナーは、次の操作を行います:

  1. はそのフラグメントに対するsubscribedされているリスナーをfind allます。
  2. そのfragmentpending eventを確認してください。
  3. Firefragmentのいずれかに対応する任意のpending eventです。

フラグメントまたはアクティビティが現在の表示になっていることをどのように知ることができますか。そのフラグメントやアクティビティがすぐに表示されるように、私は保留中のイベントを放つことができますか?

私の実装の概要:

//Defining the Interface 
public class MyCustomObject { 
    // Step 1 - This interface defines the type of messages I want to  communicate to my owner 
    public interface MyCustomObjectListener { 
     // These methods are the different events and 
     // need to pass relevant arguments related to the event triggered 
     public void onDataChange(MyCustomObject obj); 
     // or when data has been loaded 
     public void onDataDestroy(MyCustomObject obj); 
    } 
} 


// Create Listener Setter 
public class MyCustomObject { 

    // Step 2 - This variable represents the listener passed in by the owning object 
    // The listener must implement the events interface and passes messages up to the parent. 
    private MyCustomObjectListener listener; 

    // Constructor where listener events are ignored 
    public MyCustomObject() { 
     // set null or default listener or accept as argument to constructor 
     this.listener = null; 
    } 

    // Assign the listener implementing events interface that will receive the events 
    public void setCustomObjectListener(MyCustomObjectListener listener) { 
     this.listener = listener; 
    } 

} 

//Implement Listener Callback 
public class MyParentActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // ... 
     // Create the custom object 
     MyCustomObject object = new MyCustomObject(); 
     // Step 4 - Setup the listener for this object 
     object.setCustomObjectListener(new MyCustomObject.MyCustomObjectListener() { 
      @Override 
      public void onDataChange(MyCustomObject obj) { 
       // Code to handle on data change event 
      } 

      @Override 
      public void onDataDestroy(MyCustomObject obj) { 
       //Code to handle onDestroy event. 
      } 
     }); 
    } 
} 

問題

は今Event1を想定---- --->Fragment1 view -----とでsubscribedを取得同じEvent1fired/publish ----> fragment2ビューで取得します

したがって、when does Fragment1 get in view againを知っているので、Fragment1が表示されたらすぐにfireEvent1とすることができます。私は、ライブラリを実装しています

は、このように私たちは、それぞれの断片/アクティビティのイベントのバグのために登録する必要が最初GreenRobot

のように実装いくつかのEventBusライブラリで何が起こるかに近いソリューションを必要NOTE

。フラグメントは、すぐフラグメントがビューに入るよう考慮し、火災のイベントで取得するときEventBusでpostStickyイベントの実装が知っているどのよう

//Define events 
    public class MessageEvent { /* Additional fields if needed */ } 
//Prepare subscribers: Register your subscriber (in your onCreate or in a constructor): 
eventBus.registerSticky(this); 

//Declare Subscriber method 
@Subscribe 
public void onDataChange(MessageEvent obj) {/* Do something */}; 

//Post events: 
eventBus.postSticky(event); 

。?

答えて

1

1.フラグメントまたはアクティビティが現在の表示になっていることをどのように知ることができますか。そのフラグメントやアクティビティがすぐに表示されるように、私は保留中のイベントを放つことができますか?

フラグメントやアクティビティがいつ表示されるかは心配ありません。コンポーネントのライフサイクルを活用してください。 oncreateまたはonResumeに登録し、onDestroyでサブスクリプションの登録を解除するか、一時停止します。

2。EventBusでのpostStickyイベントの実装は、フラグメントがビューに入った時点を知っていて、フラグメントがビューに入るとすぐにイベントを発生させます。

EventBusは、イベントをキューに格納します。コンポーネントがパブリッシャを登録すると、イベントはコンポーネントの一致するメソッドに配信されます。

関連する問題