web-dev-qa-db-ja.com

Rxjavaを使用してアクティビティからフラグメントを更新するAndroid

次のような簡単な使用例があります。

  • Activity1はfragment1を作成します

  • 作成後のfragment1は、作成されたことをアクティビティに通知し、そのアクティビティ1ビューを更新します。

  • 通知更新fragment1ビューを取得した後のactivity1。

私はrxandroid、サブライブラリrxlifecycleコンポーネント、Androidを使用していますが、まだ学習段階にあり、stackoverflowにrx-lifecycleタグすらなかったので、まだですこのライブラリの流れを理解するのに苦労しています。

編集

私はEventBusを使用したくない、それはみんなが何かをするためにみんなに叫んでいるようなものなので、RxjavaObservableアプローチは非常に便利です

17
Zulqurnain Jutt

フラグメントからアクティビティに情報を投稿するには、イベントバスを使用して、フラグメントの作成(コールバックとそれらが作成した混乱への置き換え)についてアクティビティに通知する必要があります。

RxJavaを使用したイベントバスのサンプルコードは次のとおりです。

_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);
    }
}
_

次に、フラグメントから次のように呼び出すことができます。

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

onAttach()またはonViewCreated()または任意の場所から。

また、アクティビティでは、イベントバスにlistetするために次のコードを配置する必要があります。

_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
            }
        }
    });
_

2番目の部分、つまりアクティビティからフラグメントを更新する場合、不必要な複雑さをもたらすため、この方法を使用することはお勧めしません。代わりに、「元の方法」を次のように使用します。

  1. FragmentにupdateView(Object obj)としてメソッドを作成します
  2. onNext()で、目的のフラグメントをSampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");として取得します
  3. fragment.updateView(obj);を呼び出す

お役に立てれば。

6
idle_developer

考慮すべき2つのポイント:

  1. EventBusを使用しているからといって、それがグローバルである必要があるという意味ではありません。必要に応じて複数のイベントバスを使用でき、2つのコンポーネント(アクティビティとフラグメント)間で1つのイベントバスを共有できます。

  2. RxJavaドキュメントには、RxJavaを使用してイベントバス機能を実装する方法を示すいくつかの例があります。

イベントバスを使用すると、プロセス全体をAndroidライフサイクルから切り離すことで、作業を大幅に簡素化できます。

6
GreyBeardedGeek