Использование контекста в фрагменте

Как я могу получить контекст в фрагменте?

Мне нужно использовать мою базу данных, конструктор которой принимает контекст, но getApplicationContext() и FragmentClass.this не работают, так что я могу сделать?

Конструктор базы данных

 public Database(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } 

Solutions Collecting From Web of "Использование контекста в фрагменте"

Вы можете использовать getActivity() , который возвращает активность, связанную с фрагментом.
Активность – это контекст (поскольку Activity расширяет контекст) .

Чтобы сделать как ответ выше, вы можете переопределить метод onAttach фрагмента:

 public static class DummySectionFragment extends Fragment{ ... @Override public void onAttach(Activity activity) { super.onAttach(activity); DBHelper = new DatabaseHelper(activity); } } 

Всегда используйте метод getActivity (), чтобы получить контекст вашей приложенной активности, но всегда помните одну вещь: фрагменты немного нестабильны, а getActivity возвращает null несколько раз, поэтому для этого всегда проверяйте метод adAdded (), прежде чем получать контекст getActivity() .

Самый простой и самый точный способ получить контекст фрагмента, который я нашел, – это получить его непосредственно из ViewGroup когда вы вызываете метод onCreateView по крайней мере, здесь вы уверены, что не получите null для getActivity() :

 public class Animal extends Fragment { Context thiscontext; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { thiscontext = container.getContext(); 
 @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); context=activity; } 

Для получения контекста внутри фрагмента возможно использование getActivity() :

 public Database() { this.context = getActivity(); DBHelper = new DatabaseHelper(this.context); } 
  • Будьте осторожны, чтобы получить Activity связанную с фрагментом, используя getActivity() , вы можете использовать его, но не рекомендуется, что это вызовет утечку памяти.

Я думаю, что лучший aproach должен получать Activity из onAttach() :

 @Override public void onAttach(Activity activity) { super.onAttach(activity); context = activity; } 

Другой альтернативный подход:

Вы можете использовать контекст, используя:

 getActivity().getApplicationContext(); 

getContext() пришел в API 23. Замените его getActivity () всюду в коде.

Посмотрите, исправляет ли она ошибку. Попытайтесь использовать методы, которые находятся между целевым и минимальным уровнями API, иначе эта ошибка возникнет.

Поскольку API-уровень 23 имеет getContext() но если вы хотите поддерживать более старые версии, вы можете использовать getActivity().getApplicationContext() то время как я по-прежнему рекомендую использовать версию поддержки Fragment которая является android.support.v4.app.Fragment .

getActivity() – это ребенок контекста, который должен работать на вас

Вы также можете получить контекст из параметра inflater , когда переопределяете onCreateView .

 public static class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /* ... */ Context context = inflater.getContext(); /* ... */ } } 

В идеале вам не нужно использовать глобальные переменные. Фрагмент имеет разные уведомления, один из которых – onActivityCreated. Вы можете получить экземпляр активности в этом жизненном цикле фрагмента.

Затем: вы можете разыменовать фрагмент, чтобы получить активность, контекст или applicationcontext по вашему желанию:

this.getActivity() предоставит вам дескриптор активности this.getContext() предоставит вам дескриптор контекста this.getActivity().getApplicationContext() предоставит вам дескриптор контекста приложения. Вы должны предпочтительно использовать контекст приложения при передаче его в db.

Простым способом является использование getActivity() . Но я думаю, что основная путаница использования getActivity() для получения контекста здесь – исключение нулевого указателя.

Для этого сначала проверьте метод isAdded() который определит, добавлен он или нет, и затем мы можем использовать getActivity() чтобы получить контекст Activity.

Метод getContext () помогает использовать Контекст класса в активности фрагмента.

Используйте фрагменты из библиотеки поддержки

 android.support.v4.app.Fragment 

И затем переопределить

 void onAttach (Context context) { this.context = context; } 

Таким образом, вы можете быть уверены, что контекст всегда будет ненулевым значением.

Вы можете вызвать getActivity() или,

 public void onAttach(Context context) { super.onAttach(context); this.activity = (CashActivity) context; this.money = this.activity.money; } 

У вас есть разные варианты:

  • Если ваш minSDK <= 21, вы можете использовать getActivity() , поскольку это Context .
  • Если ваш minSDK равен> = 23, вы можете использовать getContext() .

Если вам не нужно поддерживать старые версии, перейдите к getContext() .