Как поместить объект приложения в класс фрагмента

Я меняю свое мобильное приложение для Android для поддержки планшетов и мобильных телефонов. Для этого я меняю свой класс активности на фрагмент. В моем классе активности у меня есть экземпляр моего класса приложения, созданный, как показано ниже:

appCtx = (UnityMobileApp) getApplication();

Где UnityMobileApp - мой класс приложения.

Теперь я хочу создать такой же экземпляр в моем классе фрагментов. Не могли бы вы, ребята, помочь мне решить эту проблему?


person Rakesh Gourineni    schedule 20.07.2012    source источник
comment
Вы должны опубликовать еще немного фрагмента кода. Спасибо :)   -  person SALMAN    schedule 20.07.2012


Ответы (5)


Используйте appCtx = (UnityMobileApp) getActivity().getApplication(); в своем фрагменте.

person biegleux    schedule 20.07.2012
comment
Обратите внимание, что в некоторых случаях приведенный выше код будет вызывать NPE, потому что он может быть вызван в ситуации, когда getActivity() вернет null (например, в середине вращения) - person Ognyan; 21.07.2013
comment
Используйте его в: @Override public void onActivityCreated (Bundle savedInstanceState) {super.onActivityCreated (savedInstanceState); приложение = ((MyApplication) getActivity (). getApplication ()); } - person Dzianis Yafimau; 14.02.2015

Метод getActivity() может иметь возможность возвращать null. Это может привести к сбою вашего приложения, поэтому безопасно использовать этот метод внутри onActivityCreated(). Например:

private UnityMobileApp appCtx;
.
.
...
@Override
public View onCreateView(...){
...
}

@Override public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     appCtx = ((UnityMobileApp) getActivity().getApplication()); 
} 
...
//access the application class methods using the object appCtx....

Этот ответ основан на ответе Дзианиса Яфима на вопрос Огняна в комментариях. Таким образом, заслуга Дзианиса Яфима и Огняна в stackoverflow.

person BharathRao    schedule 27.04.2018

Поскольку вы пытаетесь использовать контекст приложения из фрагмента, вы не можете использовать getApplication(), потому что это не метод класса фрагмента
Итак, сначала вам нужно использовать getActivity(), который вернет действие фрагмента, с которым в настоящее время связан фрагмент.

подвести итог в вашем коде,

вместо this.getApplication() вы должны использовать getActivity.getApplication()

узнать больше о getActivity() из документации по Android

person Irony Stack    schedule 30.11.2017

В качестве альтернативы с помощью Kotlin

fun bar() {
   (activity?.application as UnityMobileApp).let {
      it.drink()
   } ?: run {
      Log.d("DEBUG", "(╯°□°)╯︵ ┻━┻")
   }
}
person Alex Nolasco    schedule 21.05.2019

Новый способ:

Application application = requireActivity().getApplication();
person hata    schedule 10.02.2021