it-swarm.com.ru

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

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

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

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

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

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

1235
user658042

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

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

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

24
Ankur Chaudhary

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

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

получить контекст внутри фрагмента можно с помощью 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;
}
5
Elenasys

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

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

getActivity().getApplicationContext();
4
codercat

Ранее я использовал 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
Nilesh Rathod

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

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

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

3
Androbin

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

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

3
Naveen

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

Android.support.v4.app.Fragment

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

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

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

2
lomza

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

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

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

2
Jorge

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

2
qazimusab

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

Несоответствие типов: предполагаемый тип - это Контекст? но контекст ожидался

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

val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, Android.R.color.black))
2
KishanSolanki124

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

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

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

1
Abduhafiz

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

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

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

1
user5610809

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

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

1
Saubhagya Ranjan Das

На тебе фрагмент

((Name_of_your_Activity) getActivity()).helper

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

DbHelper helper = new DbHelper(this);
0
Kinggeov

Мне нужен контекст для использования фрагмента arrayAdapter IN, когда я использовал getActivity ошибка возникает, но когда я заменяю ее на getContext это работает для меня

listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),Android.R.layout.simple_list_item_1 ,listSensorType));
0
ghazaleh javaheri

Я думаю, что вы можете использовать

public static class MyFragment extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

      Context context = getActivity.getContext();

  }
}
0
aswinbhim nath

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

0
Gavine Joyce

Вы можете использовать getActivity() или getContext во фрагменте.

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

/**
 * Return the {@link FragmentActivity} this fragment is currently associated with.
 * May return {@code null} if the fragment is associated with a {@link Context}
 * instead.
 *
 * @see #requireActivity()
 */
@Nullable
final public FragmentActivity getActivity() {
    return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}

а также

 /**
     * Return the {@link Context} this fragment is currently associated with.
     *
     * @see #requireContext()
     */
    @Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }

Pro tip

Всегда проверять if(getActivity!=null) потому что может быть нулевым когда фрагмент не привязан к действию. Иногда выполнение длительной операции во фрагменте (например, выборка данных из остальных API) занимает некоторое время. и если пользователь перейдет к другому фрагменту. Тогда getActivity будет нулевым. И вы получите NPE, если не справитесь.

0
Khemraj

Также вы можете использовать:

inflater.getContext();

но я бы предпочел использовать

getActivity()

или же

getContext
0
Deplover
public class MenuFragment extends Fragment implements View.OnClickListener {
    private Context mContext;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        FragmentMenuBinding binding=FragmentMenuBinding.inflate(inflater,container,false);
        View view=binding.getRoot();
        mContext=view.getContext();
        return view;
    }
}
0
Mohsinali