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

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

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

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

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

23 ответов


можно использовать 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 несколько раз, поэтому для этого всегда проверяйте isAdded() метод фрагмента перед получением контекста по 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() является дочерним контекстом, поэтому он должен работать для вас


у вас есть различные варианты:

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

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


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

несоответствие типов: выводимый тип-это контекст? но контекст, как ожидается,

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

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

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

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

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


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

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


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

android.support.v4.app.Fragment

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

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

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


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


можно назвать getActivity() или

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

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

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

      Context context = getActivity.getContext();

  }
}

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;
    }
}

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

inflater.getContext();

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

getActivity()

или

getContext

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

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

можно использовать 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), потому что это может быть null когда фрагмент не привязан к деятельности. Иногда выполнение длительной операции во фрагменте (например, извлечение данных из REST api) занимает некоторое время. и если пользователь перейдет к другому фрагменту. Тогда getActivity будет нулевым. И вы получите NPE, если вы не справились с этим.