В чем разница между requireActivity и onActivityCreated - PullRequest
0 голосов
/ 05 апреля 2020

В моем коде я загружал картинки после onCreateView () неудобно, потому что я не был уверен, что действие еще доступно. Поскольку Glide требовался контекст активности, я поместил этот фрагмент кода в onActivityCreated ()


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

                //Crash unexpected since onActivityCreated should always have activity available
                Glide.with(activity!!)
                    .load(viewModel.moment!!.mediaPath)
                    .into(binding.momentPhoto);
    }

Однако, после просмотра некоторых лучших практик на Github, многие примеры загружают фотографии в onCreateView (). Они делают это с помощью метода requireActivity ()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_photo_editor, container, false)

        Glide.with(requireActivity())
              .load(viewModel.moment!!.mediaPath)
              .into(binding.momentPhoto);

        return binding.root
    }

Кто-нибудь знает, в чем разница между использованием ссылки на активность после onActivityCreated () и получением ссылки на активность из requireActivity ()?

Ответы [ 2 ]

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

Мы должны разделить этот ответ на две части.

1. Разница между activity!! и requireActivity()

Они оба вызывают getActivity(), и оба выдают исключение, если Activity равно нулю. Единственное отличие - это тип возвращаемого исключения и его сообщение. Конечно, requireActivity() вызывает более явное исключение.

2. «Разница» между onActivityCreated() и onCreateView()

Метод onActivityCreated() вызывается после onCreateView(), когда оба вида Activity и Fragment уже создан.

Метод onCreateView() вызывается до onActivityCreated(), когда представление Fragment должно быть все еще создано.

В вашем сценарии нет разницы в том, куда вы положили Glide использование. Было бы разницей, если бы ваш Fragment сохранил свой экземпляр или если ImageView находится внутри Activity.

Кстати, я бы перенес ваше использование Glide в onViewCreated() поскольку onActivityCreated() скоро станет устаревшим (https://developer.android.com/jetpack/androidx/releases/fragment#1 .3.0-alpha02 ).

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

Это совершенно разные вещи, и в них нет единственного сходства, кроме словесной активности.

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

requireActivity() метод, который возвращает ненулевой экземпляр действия для фрагментации или выдает исключение.

Если вы 100% уверен, что в жизненном цикле вашего фрагмента активность не равна нулю, используйте requireActivity(), так как в этом нет необходимости !! нотации внутри кода, иначе поместите его в блок try-catch, чтобы избежать NullPointerException .

onActivityCreated() - это метод жизненного цикла, который вызывается при создании родительской активности фрагмента.

.

...