android - реализация ViewModel между 2 фрагментами без использования getActivity () - PullRequest
0 голосов
/ 16 апреля 2020

В моем приложении 2 фрагмента. когда пользователь нажимает кнопку в первом фрагменте, добавляется второй фрагмент, чтобы пользователь мог вставить некоторые данные. и затем он закрывается и возвращает вставленные данные в первый фрагмент. Я использовал ViewModels для этой связи между фрагментами.

    collectionsEditedViewModel = new ViewModelProvider(getActivity()).get(CollectionsEditedViewModel.class);
    collectionsEditedViewModel.isEdited().observe(getViewLifecycleOwner(), new Observer<Bundle>() {
        @Override
        public void onChanged(Bundle bundle) {
        }
    });

связь работает правильно. но дело в том, как я могу определить объем этого общения внутри фрагментов. в настоящее время я использую getActivity() в качестве ViewmodelStoreOwner, что заставляет данные набора быть доставленными в первый фрагмент при каждом его открытии. как я могу решить эту проблему?

1 Ответ

1 голос
/ 16 апреля 2020

Я считаю, что для связи между Фрагментами через Activity есть путь к go, поэтому вы находитесь на правильном пути.

Одна вещь, которую вы могли бы сделать, это использовать класс SingleLiveData, который по сути как LiveData, но после того, как его значение установлено, оно обнуляется, поэтому его получает только первый наблюдатель:

class SingleLiveData<T> : MutableLiveData<T>() {

    private val mPending = AtomicBoolean(false)

    @MainThread
    override fun observe(owner: LifecycleOwner, observer: Observer<T>) {

        if (hasActiveObservers()) {
            Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
        }

        // Observe the internal MutableLiveData
        super.observe(owner, Observer { t ->
            if (mPending.compareAndSet(true, false)) {
                observer.onChanged(t)
            }
        })
    }

    @MainThread
    override fun setValue(t: T?) {
        mPending.set(true)
        super.setValue(t)
    }

    /**
     * Used for cases where T is Void, to make calls cleaner.
     */
    @MainThread
    fun call() {
        value = null
    }

    companion object {
        private val TAG = "SingleLiveData"
    }
}

Затем вы можете просто позвонить: singleLiveData.call() для «установки и уничтожения» и, таким образом, забыть значение после первого использования! Класс получен (и используется в моих проектах в течение многих лет) из: { ссылка }

...