11

新しいアーチを使用しています。グーグルからのコンポーネント。

おかげで管理されているアクティビティログイン/フラグメントの登録にありますFragmentTransaction

Activity->RegisterFragment (with ViewPager) -> RegistrationSteps (adapter)

RegisterFragment 内には ViewPager があります。内部のすべてのページViewPagerが同じ ViewModel を使用するようにします。

これらは、 ViewModelのスコープを設定した親LifecycleOwnerRegistrationStepFragmentを取得する登録手順 ( ) です。ViewModel のスコープをこの親 Fragment に設定したかっただけです。RegistrationFragment

継承元のRegistrationFragment.class

public interface FragmentViewPagerListener<T extends LifecycleFragment> {
    void nextPage();
    T getLifecycleFragment();
}

RegistartionSteps (ページ) から継承

public abstract class RegisterStepFragment extends LifecycleFragment {
    protected FragmentViewPagerListener mListener;
    protected RegisterViewModel mViewModel;

    public void setListener(FragmentViewPagerListener fragmentViewPagerListener) {
        this.mListener = fragmentViewPagerListener;
    }

    protected abstract void observeViewModel();

    @Override
    public void onCreated(@Nullable Bundle savedInstanceState) {
        super.onCreated(savedInstanceState);
        mViewModel = ViewModelProviders.of(mListener.getLifecycleFragment()).get(RegisterViewModel.class);
        observeViewModel();
    }

    protected abstract boolean validateData();
}

3ページに到達するまではすべてうまくいき、(2ページ目に)戻りたいと思います次にmViewPager.setCurrentItem(1)(ページ2:インデックス:1)で例外がスローされます

*java.lang.RuntimeException: Failed to call observer method
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.invokeCallback(ReflectiveGenericLifecycleObserver.java:79)
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.invokeMethodsForEvent(ReflectiveGenericLifecycleObserver.java:53)
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.invokeCallbacks(ReflectiveGenericLifecycleObserver.java:61)
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:45)
                                                                      at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.sync(LifecycleRegistry.java:209)
                                                                      at android.arch.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:102)
                                                                      at android.arch.lifecycle.Li*fecycleDispatcher.dispatchIfLifecycleOwner(LifecycleDispatcher.java:150)

編集

OK、前のページに移動すると、フラグメントが再作成され、mViewModel.observable()以前のSUCCESSメッセージを受信し、viewpager が前方に移動したため、作成されたばかりのフラグメントが破棄されてエラーが発生したことがわかりました。

解決策は、投稿が呼び出されたときにのみ値を発行するSingleEventLiveDataを作成することです (オブザーバーがアタッチされる前に値が変更された場合、オブザーバーに通知しません)

私はそれをCLOSEとマークします

4

0 に答える 0