Использование контекста во фрагменте - PullRequest
623 голосов
/ 21 ноября 2011

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

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

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

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

Ответы [ 26 ]

3 голосов
/ 19 июня 2016

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

2 голосов
/ 14 февраля 2017

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

android.support.v4.app.Fragment

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

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

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

2 голосов
/ 10 ноября 2014

getActivity() - дочерний элемент Context, поэтому он должен работать для вас

2 голосов
/ 08 февраля 2018

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

Несоответствие типов: выведенный тип - это Context?но Context ожидалось

, для этого вы можете сделать это

val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
2 голосов
/ 30 июня 2016

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

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

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

1 голос
/ 19 апреля 2019

In kotlin просто используйте activity вместо getActivity()

1 голос
/ 20 октября 2015

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

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

1 голос
/ 11 апреля 2016

Вы можете позвонить getActivity() или

public void onAttach(Context context) {
    super.onAttach(context);
    this.activity = (CashActivity) context;
    this.money = this.activity.money;
}
1 голос
/ 27 ноября 2015

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

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

this.getActivity() волядаст вам дескриптор действия this.getContext() даст вам дескриптор контекста this.getActivity().getApplicationContext() даст вам дескриптор контекста приложения.Желательно использовать контекст приложения при передаче его в БД.

0 голосов
/ 13 ноября 2018

На вашем фрагменте

((Name_of_your_Activity) getActivity()).helper

На активности

DbHelper helper = new DbHelper(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...