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

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

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

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

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

Ответы [ 26 ]

1242 голосов
/ 21 ноября 2011

Вы можете использовать getActivity(), который возвращает действие, связанное с fragment.
Активность context (поскольку Activity расширяется Context) .

127 голосов
/ 25 октября 2012

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

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}
24 голосов
/ 04 марта 2014

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

19 голосов
/ 05 февраля 2014

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

public class Animal extends Fragment { 
  Context thiscontext;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    thiscontext = container.getContext();
9 голосов
/ 17 июня 2014
@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    context=activity;
}
5 голосов
/ 06 декабря 2014

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

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

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

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    context = activity;
}
4 голосов
/ 10 октября 2018

Ранее я использовал onAttach (Activity activity), чтобы получить context в Fragment

Проблема

Метод onAttach (Activity activity) устарел на уровне API 23.

Решение

Теперь, чтобы получить контекст в Fragment, мы можем использовать onAttach (Context context)

onAttach (Context context)

  • Вызывается, когда фрагмент впервые присоединяется к его context. onCreate(Bundle) будет вызвано после этого.

Документация

/**
 * Called when a fragment is first attached to its context.
 * {@link #onCreate(Bundle)} will be called after this.
 */
@CallSuper
public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}

КОД ОБРАЗЦА

public class FirstFragment extends Fragment {


    private Context mContext;
    public FirstFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rooView=inflater.inflate(R.layout.fragment_first, container, false);

        Toast.makeText(mContext, "THIS IS SAMPLE TOAST", Toast.LENGTH_SHORT).show();
        // Inflate the layout for this fragment
        return rooView;
    }

}

Примечание

Мы также можем использовать getActivity(), чтобы получить context в Fragments но getActivity() может вернуть null, если ваш fragment в данный момент не привязан к родителю activity,

4 голосов
/ 17 марта 2014

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

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

getActivity().getApplicationContext();
4 голосов
/ 19 ноября 2015

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

public static class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        /* ... */
        Context context = inflater.getContext();
        /* ... */
    }
}
3 голосов
/ 26 октября 2015

getContext() поставляется в API 23. Замените его на getActivity () везде в коде.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...