Android: Как отправить строку данных из одного фрагмента в другой фрагмент той же основной деятельности? - PullRequest
0 голосов
/ 06 ноября 2018

Как отправить строковый URL из одного фрагмента в другой в рамках одной и той же операции.

Ответы [ 4 ]

0 голосов
/ 07 ноября 2018

вы можете создать общий ViewModel объект, фрагменты будут связываться с помощью наблюдения LiveData.

вот базовый пример LiveData и ViewModel , дополнительную информацию можно также найти в здесь

0 голосов
/ 07 ноября 2018

Популярным вариантом сейчас является сохранение данных в ViewModel , которые могут совместно использоваться несколькими действиями / фрагментами.

Из документации:

Этот подход предлагает следующие преимущества:

  • Деятельности не нужно ничего делать или знать что-либо об этом коммуникации.
  • Фрагменты не должны знать друг о друге, кроме контракт SharedViewModel. Если один из фрагментов исчезает, другой продолжает работать как обычно.
  • Каждый фрагмент имеет свой собственный жизненный цикл, и на него не влияет жизненный цикл другого. Если один фрагмент заменяет другой, пользовательский интерфейс продолжает работать без проблем.

Хороший пример также можно найти в документации:

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, Observer<Item> { item ->
            // Update the UI
        })
    }
}
0 голосов
/ 07 ноября 2018

Данные, которые вы хотите передать во фрагмент (в зависимости от вашей проблемы вы должны передать строку вместо int):

Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

Получите ту информацию, которая вам нужна, чтобы получить аргументы, отправленные фрагменту.

Bundle bundle = this.getArguments();
if (bundle != null) {
    int i = bundle.getInt(key, defaulValue);
}

(* Нашел ответ здесь: Android: передать данные (дополнительные данные) во фрагмент )

0 голосов
/ 06 ноября 2018

У вас есть несколько способов сделать это.

Ниже я перечислил 3 варианта, чтобы делать то, что вы хотите:

  • Вы можете использовать автобус для связи между фрагментами. Для этого вы можете использовать библиотеку с именем Eventbus (https://github.com/greenrobot/EventBus),) или реализовать ее с помощью RxJava.
  • Еще один способ связи между фрагментами - вы можете поделиться объектом в деятельности, к которому ваши фрагменты могут получить доступ.
  • Наконец, вы можете реализовать диспетчер событий, разделяющий их между вашими областями.
...