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:
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).
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:
- Crear un método en Fragmento como
updateView(Object obj)
- En
onNext()
, obtenga el fragmento deseado comoSampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
- llamada
fragment.updateView(obj);
Espero que esto ayude.