Передайте данные / пакет, используя navigateUp в Android Navigation Component - PullRequest
2 голосов
/ 08 марта 2019

Я нашел вопрос, но не нашел решения в коде

Я хочу получить данные, когда происходит обратное нажатие / ручное возвращение.Я использую navigateUp(), чтобы вернуться.Как я могу передать данные в предыдущий фрагмент?navigateUp() не имеет возможности передавать данные в предыдущий фрагмент.Даже я не нашел решения, используя Safe Args .Это передача данных вперед.Я хочу иметь в обратном Frad B -> Frag A.

Мой код, чтобы вернуться к предыдущему фрагменту

Navigation.findNavController(view).navigateUp()

enter image description here

Мой вопрос, как я могу получить данные в предыдущем фрагменте.Я могу перейти к Frag A из Frag B, используя

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

Согласно developer.android.com , вы можете использовать общие для фрагментов, где вы хотите поделиться данными ViewModel , используя их область действия.

Вот шаги:

  1. Создать модель представления, в которой будут храниться данные:
class SharedViewModel : ViewModel() {
    val dataToShare = MutableLiveData<String>()

    fun updateData(data: String) {
        dataToShare.value = data
    }
}
Наблюдать за изменениями данных в Fragment1:
class Fragment1 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
        viewModel.dataToShare.observe(this, Observer<String> { dataFromFragment2 ->
            // do something with data
        })
    }
}
Обновите данные в Fragment2, и если вы правильно обрабатываете навигацию, теперь вы сможете получать изменения данных по Fragment1:
class Fragment2 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)

        updateDataButton.setOnClickListener { v ->
            viewModel.updateData("New data for fragment1")
        }
    }
}

Надеюсь, ответ поможет.

0 голосов
/ 24 мая 2019

Вы можете NavigationResult библиотека. В основном это startActivityForResult, но для фрагментов в компоненте навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...