Использование контекста во фрагменте
как я могу получить контекст во фрагменте?
мне нужно использовать мою базу данных, конструктор которой принимает в контексте, но getApplicationContext() и FragmentClass.this не работает, так что я могу сделать?
конструктор базы данных
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
23 ответов:
можно использовать
getActivity(), который возвращает действие, связанное с фрагментом.
Активность-это контекст (поскольку активность расширяет контекст).
чтобы сделать, как ответ выше, вы можете переопределить
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(), вы можете использовать его, но это не рекомендуется, это приведет к утечке памяти.Я думаю, что лучший подход должен получать
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.
у вас есть различные варианты:
- если ваш minSDK getActivity(), Так как это
Context.- если ваш minSDK >=23, то вы можете использовать
getContext().Если вам не нужно поддерживать старые версии, затем с
getContext().
для Котлина вы можете использовать
contextпрямо в осколки. Но в некоторых случаях вы найдете ошибку, какнесоответствие типов: выводимый тип-это контекст? но контекст был ожидаемым
для этого вы можете сделать это
val ctx = context ?: return textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
В идеале, вам не нужно использовать глобалы. Фрагмент имеет различные уведомления, одно из которых является 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; }таким образом, вы можете быть уверены, что контекст всегда будет ненулевое значение.
можно назвать
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(); }совет
проверить всегда
if(getActivity!=null), потому что это может быть null когда фрагмент не привязан к деятельности. Иногда выполнение длительной операции во фрагменте (например, извлечение данных из REST api) занимает некоторое время. и если пользователь перейдет к другому фрагменту. Тогда getActivity будет null. И вы получите NPE, если вы не справились с этим.
Comments