error: несовместимые типы: PesoR_Male не может быть преобразован в контекст (AlertDialog custom) [duplicate]

Важно, чтобы ответ отсутствовал, что вы должны использовать right со всеми вышеупомянутыми флагами:

cout<<"0x"<<hex<<setfill('0')<<setw(2)<<right<<10;
570
задан Peter Mortensen 31 January 2016 в 18:14
поделиться

23 ответа

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

1160
ответ дан user 16 August 2018 в 01:20
поделиться
  • 1
    getActivity () может возвращать значение null, если оно вызывается до onAttach соответствующего фрагмента. – arne.jans 29 April 2013 в 16:36
  • 2
    Я читал этот блог Google по утечкам памяти ... android-developers.blogspot.com/2009/01/… . Если я использую метод getActivity (), приложение не будет подвержено риску утечки памяти? В блоге предлагается «Попробовать использовать контекстное приложение вместо контекстной активности». что действительно невозможно, поскольку getApplicationContext () работает только для класса Activity, а не для класса Fragment. – Simon 6 April 2014 в 18:40
  • 3
    Решение проблемы выделенных фрагментов заключается в том, чтобы сохранить значение getActivity().getApplicationContext() в переменной экземпляра при создании фрагмента, а затем использовать этот контекст всякий раз, когда вы хотите внутри класса фрагмента. Этот контекст выдержит фрагментные отряды. – Piovezan 11 June 2014 в 16:08
  • 4
    Вместо того чтобы проходить вокруг контекста приложения, создайте статический контекст внутри вашего класса Application и инициализируйте его onCreate (): MyApplication.sContext = getApplicationContext (); то вы можете получить к нему доступ из любой активности / фрагмента, не беспокоясь об отстранении. – Eduard Kotysh 23 February 2015 в 19:18
  • 5
    @milaniez: getActivity всегда был доступен. Это getContext, который был добавлен в API 23. – mhsmith 15 September 2017 в 12:10

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

3
ответ дан Androbin 16 August 2018 в 01:20
поделиться

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

inflater.getContext();

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

getActivity()

или

getContext
0
ответ дан Deplover 16 August 2018 в 01:20
поделиться

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

public class Animal extends Fragment { 
  Context thiscontext;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    thiscontext = container.getContext();
14
ответ дан FariborZ 16 August 2018 в 01:20
поделиться
  • 1
    вот контекст контейнера, я думаю ... не «этот контекст». – Fattie 27 May 2014 в 13:38
  • 2
    Этот код заставил мой код сбой ... избегать. – AG1 24 January 2015 в 09:42
  • 3
    @ AG1 не могли бы вы объяснить, почему он разбил ваш код? Это пока лучшее решение, которое у меня есть – Machado 24 June 2015 в 14:55
  • 4
    Фактически на dialogFragments контейнер может быть нулевым. Быть осторожен! – Lucas Teske 7 August 2015 в 01:42

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

0
ответ дан Gavine Joyce 16 August 2018 в 01:20
поделиться

, чтобы получить контекст внутри фрагмента, будет возможно с помощью 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 16 August 2018 в 01:20
поделиться
  • 1
    Вы не должны использовать getActivity во фрагменте, чтобы получить представление, если это представление не является частью активности в любом случае. Почему бы вам раздуть представление в фрагменте, а затем даже не ссылаться на него? – tyczj 5 December 2014 в 23:53
  • 2
    Этот ответ касается чего-то другого, вы говорите о том, какой вид hiearchy искать в представлениях. Activity.findViewById - это просто удобный метод для поиска представления в зарегистрированном представлении контента активности (установленном через setContentView). В вашем правильном примере вы вызываете View.findViewById, а не Activity.findViewById, и вы вызываете метод в корневом представлении correct . Совершенно другая проблема, и, очевидно, вы не сможете найти свое мнение в представлении hiearchy, которое не поддерживает это представление. – JHH 2 March 2016 в 13:36
  • 3
    Я отредактировал свой ответ. – Jorgesys 2 March 2016 в 17:06

Вы можете использовать getActivity() или getContext в фрагменте.

Doc

/**
 * 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 16 August 2018 в 01:20
поделиться

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

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

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

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

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

android.support.v4.app.Fragment

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

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

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

1
ответ дан lomza 16 August 2018 в 01:20
поделиться

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

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

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

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}
116
ответ дан Mateus Gondim 16 August 2018 в 01:20
поделиться
  • 1
    Я бы порекомендовал это, поскольку getActivity () возвращает null, если onAttach еще не вызван. – arne.jans 29 April 2013 в 16:36
  • 2
    Но, имейте в виду, когда вызывается onAttach (), нет представлений. Таким образом, вы не можете ничего делать с просмотром! – Zordid 3 June 2013 в 20:30
  • 3
    @iambox что, если DatabaseHelper нужен FragmentActivity вместо Activity? Например, для Adapter ... – Jago 19 June 2013 в 12:27
  • 4
    Если вы сохраняете ссылку на свою активность в onAttach(Activity activity), вы должны ее отпустить в onDetach() – vovahost 14 November 2014 в 20:56
  • 5
    Метод onAttach устарел, Overrides deprecated method in 'android.support.v4.app.Fragment' – Muhammad Saqib 5 May 2017 в 17:26
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 16 August 2018 в 01:20
поделиться

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

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

      Context context = getActivity.getContext();

  }
}
0
ответ дан perror 16 August 2018 в 01:20
поделиться

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

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

19
ответ дан Peter Mortensen 16 August 2018 в 01:20
поделиться
  • 1
    @tyczj полностью прочитать, чтобы понять вашу ссылку – codercat 8 April 2014 в 09:57
  • 2
    Я бы не сказал, что фрагменты «немного нестабильны», для getActivity () кажется вполне нормальным возвращать значение null, когда фрагмент не принадлежит к активности. Предполагается, что getActivity () "не должен возвращать null" (что неверно), что сделает ваше приложение (а не класс фрагмента) неустойчивым. – personne3000 13 April 2014 в 03:31
  • 3
    @ personne3000 Хотелось бы услышать больше. Когда фрагмент не принадлежит к Деянию? Когда это происходит и почему? Должны ли мы проверять isAdded () в фрагменте, чтобы использовать getActivity ()? Любое эмпирическое правило? – Sotti 22 April 2015 в 15:41
  • 4
    @Sotti Я призываю вас создать новый вопрос для этого (или искать существующий), поскольку этот конкретный предмет немного отличается от исходного вопроса. Вы можете ознакомиться с developer.android.com/guide/components/fragments.html#Lifecycle для общей информации. В принципе, до onAttach и после onDetach нет активности. А между onAttach и onActivityCreated активность onCreate не вызывается. При использовании getActivity () убедитесь, что ваша активность уже создана, и подумайте о том, что произойдет, если оно будет уничтожено или ваш фрагмент будет отсоединен. – personne3000 22 April 2015 в 23:44
  • 5
    Как это отличается от ответа Анкура Чаудхари ? – Peter Mortensen 31 January 2016 в 18:25

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

2
ответ дан qazimusab 16 August 2018 в 01:20
поделиться

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

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

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

2
ответ дан Rahul 16 August 2018 в 01:20
поделиться

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

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

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

1
ответ дан rink.attendant.6 16 August 2018 в 01:20
поделиться

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

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

Мне нужен контекст для использования фрагмента 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 16 August 2018 в 01:20
поделиться
20
ответ дан Peter Mortensen 6 September 2018 в 00:40
поделиться
0
ответ дан Nilesh Rathod 29 October 2018 в 07:26
поделиться
22
ответ дан Peter Mortensen 29 October 2018 в 07:26
поделиться
Другие вопросы по тегам:

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