android android-fragments android-activity rx-android rx-binding

Actualizando fragmento desde Activity Using Rxjava Android



android-fragments android-activity (2)

Tengo un caso de uso simple donde:

  • Actividad1 crear un fragmento1

  • después de la creación, fragment1 notifica a la actividad que se ha creado y actualiza sus vistas de actividad1.

  • actividad1 después de recibir la notificación de actualización fragmento1 vistas.

Estoy usando rxandroid, rxlifecycle components y android, pero todavía estoy en la fase de aprendizaje, ni siquiera había rx-lifecycle etiqueta rx-lifecycle life- rxlifecycle en stackoverflow, así que todavía estoy luchando por entender el flujo de esta biblioteca ...

Editar

Prefiero no usar EventBus, es como si todos gritaran a todos para que hagan algo, así que el enfoque de Rxjava Observable será muy útil.


Dos puntos a considerar:

  1. El hecho de que use un EventBus no significa que deba ser global. Puede tener varios buses de eventos si lo desea, y puede compartir uno solo entre dos componentes (Actividad y Fragmento).

  2. Hay varios ejemplos en la documentación de RxJava que muestran cómo implementar la funcionalidad del bus de eventos utilizando RxJava.

Al utilizar un bus de eventos, puede simplificar las cosas en gran medida, al desvincular todo el proceso del ciclo de vida de Android.


Para publicar información de fragmento a actividad, debe usar un bus de eventos para informar la actividad sobre la creación de fragmentos (reemplazo de las devoluciones de llamada y el desorden que crearon).

El código de ejemplo para el bus de eventos con RxJava es:

public class SampleEventsBus { private static final String TAG = SampleEventsBus.class.getSimpleName(); private static final String TAG2 = SampleEventsBus.class.getCanonicalName(); public static final int ACTION_FRAGMENT_CREATED = 1; public static final int ACTION_FRAGMENT_OTHER = 2; private static SampleEventsBus mInstance; public static SampleEventsBus getInstance() { if (mInstance == null) { mInstance = new SampleEventsBus(); } return mInstance; } private SampleEventBus() {} private PublishSubject<Integer> fragmentEventSubject = PublishSubject.create(); public Observable<Integer> getFragmentEventObservable() { return fragmentEventSubject; } public void postFragmentAction(Integer actionId) { fragmentEventSubject.onNext(actionId); } }

Entonces desde tu fragmento puedes llamar:

SampleEventsBus.getInstance().postFragmentAction(SampleEventsBus.ACTION_FRAGMENT_CREATED);

desde onAttach() o onViewCreated() o cualquier lugar que prefiera.

Además, en la actividad, deberá colocar el siguiente código para listar en su bus de eventos:

SampleEventsBus .getInstance().getFragmentEventObservable().subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Integer actionId) { if(actionId == SampleEventsBus.ACTION_FRAGMENT_CREATED) { //do any required action } } });

Para la segunda parte, es decir, para actualizar el fragmento de la actividad, no recomendaré el uso de este método, ya que dará lugar a una complejidad innecesaria. En su lugar, utilice la "forma original" como:

  1. Crear un método en Fragmento como updateView(Object obj)
  2. En onNext() , obtenga el fragmento deseado como SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
  3. llamada fragment.updateView(obj);

Espero que esto ayude.