getActivity () возвращает ноль в функции Fragment - PullRequest
170 голосов
/ 02 июня 2011

У меня есть фрагмент (F1) с открытым методом, подобным этому

public void asd() {
    if (getActivity() == null) {
        Log.d("yes","it is null");
    }
}

, и да, когда я его вызываю (из Activity), он нулевой ...

FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction();
F1 f1 = new F1();
transaction1.replace(R.id.upperPart, f1);
transaction1.commit();
f1.asd();

Это должно быть что-то, что я делаю очень неправильно, но я не знаю, что это такое

Ответы [ 13 ]

0 голосов
/ 06 января 2019

Еще одним хорошим решением было бы использование Android LiveData с архитектурой MVVM.Вы должны определить объект LiveData внутри вашей ViewModel и наблюдать его в своем фрагменте, и когда значение LiveData изменяется, оно уведомит вашего наблюдателя (фрагмент в данном случае) только в том случае, если ваш фрагмент находится в активном состоянии, поэтому будет гарантированосделает ваш пользовательский интерфейс работающим и получит доступ только к активности, когда ваш фрагмент находится в активном состоянии.Это одно из преимуществ LiveData

Конечно, когда этот вопрос был задан впервые, LiveData не было.Я оставляю здесь этот ответ, потому что, как я вижу, эта проблема все еще существует, и она может кому-то помочь.

0 голосов
/ 17 апреля 2018

Вы можете использовать onAttach или если вы не хотите помещать onAttach везде, тогда вы можете поместить метод, который возвращает ApplicationContext, в основной класс приложения:

public class App {
    ...  
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }

    public static Context getContext() {
        return context;
    }
    ...
}

После этого вы можете использовать его повсюду в вашем проекте, например:

App.getContext().getString(id)

Пожалуйста, дайте мне знать, если это не работает для вас.

0 голосов
/ 26 февраля 2017

Те, у кого все еще есть проблема с onAttach (Activity Activity), его просто изменили на Context -

    @Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
}

В большинстве случаев вам достаточно будет сохранить контекст - например, если вы хотите сделатьgetResources () вы можете сделать это прямо из контекста.Если вам все еще нужно включить контекст в свою активность, сделайте это -

 @Override
public void onAttach(Context context) {
    super.onAttach(context);
    mActivity a; //Your activity class - will probably be a global var.
    if (context instanceof mActivity){
        a=(mActivity) context;
    }
}

Как предложено пользователем 1868713.

...