Используя связи в фрагмент
как я могу получить контекст в фрагмент?
мне нужно использовать мою базу данных, конструктор которой принимает в контексте, но 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
.
у вас есть различные варианты:
- если ваш 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;
}
таким образом, вы можете быть уверены, что контекст всегда будет ненулевое значение.
можно назвать 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, если вы не справились с этим.