kotlin global Activity Просмотреть ссылку на фрагмент - PullRequest
0 голосов
/ 02 июля 2019

Я создаю приложение подкаста с одним действием, состоящим из 2 элементов:

  • NavHostFragment
  • ExoPlayerView (в данном случае только PlayerControlView с Id exoplayer_view)

Я хотел бы установить глобальную переменную со ссылкой на представление exoplayer, чтобы я мог использовать эту переменную в своих фрагментах и ​​прикрепленных моделях просмотра для воспроизведения / остановки / загрузки аудио.Как бы я эффективно реализовал это в kotlin?

Прямо сейчас, всякий раз, когда мне нужен exoplayer внутри фрагмента, я воссоздаю переменную, подобную этой:

var exoplayerView = (activity as MainActivity).exoplayer_view

Установив глобальную переменную вактивность, мне не нужно делать это снова и снова по всему приложению.Это также, вероятно, менее исчерпывает память, чем создание другой ссылки в каждом фрагменте / модели представления.

MainActivity:

...
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    // global reference to use for all fragments, viewmodels and helper classes
    var exoplayerView: PlayerControlView = exoplayer_view

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ....
    }

    override fun onStop() {
        super.onStop()
        releasePlayer(exoplayer_view)
    }
}

Фрагмент:

class TracksFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        ...
        // make use of exoplayer reference within the fragment and/or viewmodel
        // the exoplayerView variable can not be recognised here
        if(exoplayerView.player==null) exoplayerView.player = viewModel.player
        ...

        return binding.root
    }
}

Я подумал, настроивссылка на exoplayerView, как это я мог бы получить его из моего фрагмента.Однако это не так.Как я могу сделать что-то подобное эффективным способом?

1 Ответ

1 голос
/ 02 июля 2019

Виды не должны быть доступны «глобально», как это, попробуйте представить действия и фрагменты как вложенные модули, внутренние функции которых скрыты и защищены открытыми интерфейсами.

Вот один из рекомендованных подходовдо того, как общие ViewModels стали чем-то единым:

https://developer.android.com/training/basics/fragments/communicating

По сути, вы можете сделать так, чтобы ваша Activity реализовала какой-то интерфейс, представляющий функциональность, которую вы хотите сделать доступной для дочерних фрагментов.Затем фрагменты получают доступ к этому путем приведения имеющегося экземпляра Activity к переменной этого типа интерфейса.Это позволяет вам вызывать этот метод непосредственно во фрагменте.

В лучшем подходе используется общая модель представления между операциями и фрагментами.Вы можете сделать так, чтобы ViewModel выставлял видимые поля или LiveData, которые можно задавать и наблюдать этими действиями и фрагментами.Например, у вас может быть поле во ViewModel, которое представляет состояние этого игрока.Некоторое действие пользователя во Фрагменте может установить значение этого поля, а наблюдатель в Деятельности может вызвать некоторое поведение у игрока.

...