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



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



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



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



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

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.

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

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

  • если ваш 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;
}

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

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

совет

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

Comments

    Ничего не найдено.