Как я могу получить контекст во фрагменте?
Мне нужно использовать свою базу данных, чей конструктор принимает в контексте, но так getApplicationContext()
и FragmentClass.this
не работает, что я могу сделать?
Конструктор базы данных
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity().getApplicationContext()
переменной экземпляра при создании фрагмента, а затем использование этого контекста всякий раз, когда вы хотите внутри класса фрагмента. Этот контекст переживет фрагменты отрядов.getActivity
всегда был доступен. ЭтоgetContext
было добавлено в API 23.Чтобы сделать ответ выше, вы можете переопределить
onAttach
метод фрагмента:источник
DatabaseHelper
нужноFragmentActivity
вместоActivity
? Например, дляAdapter
...onAttach(Activity activity)
то вы должны выпустить ее вonDetach()
onAttach
Метод устарел,Overrides deprecated method in 'android.support.v4.app.Fragment'
Всегда используйте метод getActivity () для получения контекста вашей прикрепленной активности, но всегда помните одну вещь: фрагменты немного нестабильны и
getActivity
возвращают null несколько раз, поэтому для этого всегда проверяйте метод фрагмента isAdded () перед получением контекстаgetActivity()
.источник
Самый простой и точный способ получить контекст фрагмента, который я нашел, это получить его непосредственно из того,
ViewGroup
когда вы вызываетеonCreateView
метод, по крайней мере, здесь вы точно не получите null дляgetActivity()
:источник
Ранее я использую,
onAttach (Activity activity)
чтобы попастьcontext
вFragment
onAttach (Activity activity)
Метод был устаревшим в уровне API 23.Теперь, чтобы получить контекст,
Fragment
мы можем использоватьonAttach (Context context)
context
.onCreate(Bundle)
будет вызван после этого.ОБРАЗЕЦ КОДА
НОТА
Мы также можем использовать ,
getActivity()
чтобы получитьcontext
вFragments
ноgetActivity()
может вернуться ,null
если вашеfragment
настоящее время не прилагается к родителюactivity
,источник
источник
Вы также можете получить контекст из
inflater
параметра при переопределенииonCreateView
.источник
Другой альтернативный подход:
Вы можете получить контекст, используя:
источник
получить контекст внутри фрагмента можно будет с помощью
getActivity()
:Activity
связать фрагмент с помощьюgetActivity()
, вы можете использовать его, но не рекомендуется, это приведет к утечкам памяти.Я думаю, что лучший подход должен получить
Activity
отonAttach()
метода:источник
Activity.findViewById
Это просто удобный метод для поиска представления в зарегистрированном представлении содержимого этого действия (задано черезsetContentView
). В вашем правильном примере вы вызываетеView.findViewById
,Activity.findViewById
а не вызываете метод в правильном корневом представлении. Совершенно другая проблема, и, очевидно, вы не сможете найти свое представление в иерархии представлений, которая не поддерживает это представление.getContext()
появился в API 23. Замените его на getActivity () везде в коде.Посмотрите, исправит ли это ошибку. Попробуйте использовать методы, которые находятся между целевым и минимальным уровнями API, иначе эта ошибка возникнет.
источник
Поскольку уровень API 23 существует,
getContext()
но если вы хотите поддерживать более старые версии, вы можете использовать их,getActivity().getApplicationContext()
хотя я все еще рекомендую использовать версию поддержки,Fragment
которая естьandroid.support.v4.app.Fragment
.источник
getActivity()
это ребенок контекста, так что должен работать на васисточник
Использовать фрагменты из библиотеки поддержки -
а затем переопределить
Таким образом, вы можете быть уверены, что контекст всегда будет ненулевым значением.
источник
У вас есть разные варианты:
getActivity()
, так как этоContext
.getContext()
.Если вам не нужно поддерживать старые версии, тогда используйте
getContext()
.источник
Для Kotlin вы можете использовать
context
непосредственно во фрагментах. Но в некоторых случаях вы найдете ошибку, какдля этого вы можете сделать это
источник
В котлин просто используй
activity
вместоgetActivity()
источник
С API 29+ на Kotlin мне пришлось сделать
Примером будет
источник
В идеале вам не нужно использовать глобалы. Фрагмент имеет разные уведомления, одно из которых - onActivityCreated. Вы можете получить экземпляр действия в этом событии жизненного цикла фрагмента.
Затем: вы можете разыменовать фрагмент для получения действия, контекста или контекста приложения по своему желанию:
this.getActivity()
даст вам дескриптор действияthis.getContext()
даст вам дескриптор к контекстуthis.getActivity().getApplicationContext()
даст вам дескриптор к контексту приложения. Желательно использовать контекст приложения при передаче его в БД.источник
Простой способ заключается в использовании
getActivity()
. Но я думаю, что основная путаница в использованииgetActivity()
метода для получения контекста здесь - исключение нулевого указателя.Для этого сначала сверьтесь с
isAdded()
методом, который определит, добавлен он или нет, а затем мы сможем использоватьgetActivity()
контекст, чтобы получить контекст Activity.источник
Вы можете позвонить
getActivity()
или,источник
Вы можете использовать метод getActivity () для получения контекста или использовать метод getContext ().
Я надеюсь, что это помогает!
источник
Метод getContext () помогает использовать Контекст класса в активности фрагмента.
источник
Я думаю, что вы можете использовать
источник
источник
Также вы можете использовать:
но я бы предпочел использовать
или
источник
Мне нужен контекст для использования массива IN фрагмент IN, когда я использовал getActivity ошибка, но когда я заменяю его на getContext, он работает для меня
источник
Вы можете использовать
getActivity()
илиgetContext
во фрагменте.Документация
а также
Pro tip
Всегда проверяйте,
if(getActivity!=null)
потому что он может быть нулевым, если фрагмент не привязан к действию. Иногда выполнение длительной операции во фрагменте (например, выборка данных из остальных API) занимает некоторое время. и если пользователь перейдет к другому фрагменту. Тогда getActivity будет нулевым. И вы получите NPE, если не справитесь.источник
FragmentHostCallback
класса.На тебе фрагмент
По активности
источник
Внутренний фрагмент для образца kotlin помог бы кому-то
если вы используете привязку данных;
Где bindingView инициализируется в onCreateView, как это
источник
Метод requireContext () - самый простой вариант
пример
источник