Добавление активности в фрагмент [дубликат]

Вы пытались решить проблему с клейкой лентой?

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

 if( (n * 0.1) < 100.0 ) { return n * 0.1 - 0.000000000000001 ;}
                    else { return n * 0.1 + 0.000000000000001 ;}    

У меня была такая же проблема в проекте научной симуляции в c #, и я могу сказать вам, что если вы проигнорируете эффект бабочки, он превратится в большого толстого дракона и укусит вас в a **

557
задан Peter Mortensen 31 January 2016 в 18:14
поделиться

20 ответов

Вы можете использовать getActivity() , который возвращает активность, связанную с фрагментом. Активность - это контекст (поскольку Activity расширяет контекст) .

1164
ответ дан user 3 September 2018 в 14:12
поделиться

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

3
ответ дан Androbin 3 September 2018 в 14:12
поделиться

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

inflater.getContext();

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

getActivity()

или

getContext
0
ответ дан Deplover 3 September 2018 в 14:12
поделиться

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

public class Animal extends Fragment { 
  Context thiscontext;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    thiscontext = container.getContext();
15
ответ дан FariborZ 3 September 2018 в 14:12
поделиться

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

0
ответ дан Gavine Joyce 3 September 2018 в 14:12
поделиться

, чтобы получить контекст внутри фрагмента, будет возможно с помощью 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;
}
5
ответ дан Jorgesys 3 September 2018 в 14:12
поделиться

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

0
ответ дан Khemraj 3 September 2018 в 14:12
поделиться

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

Тип несоответствия: inferred type is Context? но ожидался контекст

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

val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
2
ответ дан KishanSolanki124 3 September 2018 в 14:12
поделиться

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

android.support.v4.app.Fragment

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

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

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

1
ответ дан lomza 3 September 2018 в 14:12
поделиться

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

public static class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        /* ... */
        Context context = inflater.getContext();
        /* ... */
    }
}
3
ответ дан luizfls 3 September 2018 в 14:12
поделиться

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

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}
116
ответ дан Mateus Gondim 3 September 2018 в 14:12
поделиться
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 3 September 2018 в 14:12
поделиться

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

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

      Context context = getActivity.getContext();

  }
}
0
ответ дан perror 3 September 2018 в 14:12
поделиться

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

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

20
ответ дан Peter Mortensen 3 September 2018 в 14:12
поделиться

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

2
ответ дан qazimusab 3 September 2018 в 14:12
поделиться

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

  • Если ваш minSDK & lt; = 21, вы можете использовать getActivity(), так как это Context.
  • Если ваш minSDK будет> = 23, тогда вы можете использовать getContext().

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

2
ответ дан Rahul 3 September 2018 в 14:12
поделиться

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

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

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

1
ответ дан rink.attendant.6 3 September 2018 в 14:12
поделиться

Вы можете вызвать getActivity() или

public void onAttach(Context context) {
    super.onAttach(context);
    this.activity = (CashActivity) context;
    this.money = this.activity.money;
}
0
ответ дан Satan Pandeya 3 September 2018 в 14:12
поделиться
@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    context=activity;
}
8
ответ дан taran mahal 3 September 2018 в 14:12
поделиться

Мне нужен контекст для использования фрагмента 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
ответ дан Umair 3 September 2018 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: