getActivity () возвращает ноль в функции Fragment

192

У меня есть фрагмент (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();

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

Lukap
источник
Я не уверен, была ли просто ошибка, когда вы вставили ее в этот пост, но вам нужно скобки после getActivity(). Кроме того, как ты делаешь этот фрагмент? У вас есть это в вашем layout.xml?
CaseyB
Куда относится второй фрагмент кода? Для oncreate () - метод действия? А вы уже вызывали setContentView ()?
Францискус Карсунке
R.id.upperPar - это элемент макета, поэтому он должен быть заменен фрагментом, но это не моя проблема. Я не понимаю, почему я получаю значение NULL, когда я вызываю getActivity () в пользовательских методах фрагментов, скажем, в методе onActivityCreated getActivity - это фактическая активность, а не NULL
Lukap
проблема не в макетах, приложение работает хорошо, но почему я получаю нулевое значение для getActivity?, между прочим, все элементы, включая фрагмент, отображаются так, как будто это не должно
возникать
1
Вы должны вызвать этот метод: f1.asd (); в методе onActivityCreated, который должен быть переопределен в вашем классе фрагмента.
Намрата Багервал

Ответы:

164

commit планирует транзакцию, то есть она не происходит сразу, а запланирована как работа с основным потоком в следующий раз, когда основной поток будет готов.

Я бы предложил добавить

onAttach(Activity activity)

метод для вашего Fragmentи поставить точку останова на него и посмотреть, когда он вызывается относительно вашего вызова asd(). Вы увидите, что он вызывается после метода, в котором вы вызываете asd()выходы. onAttachВызов , где Fragmentприкрепляются к ее деятельности и с этой точкой getActivity()будет возвращать ненулевые (пь есть также onDetach()вызов).

PJL
источник
5
Я не понял, как вы можете решить свою проблему. Если мой метод getActivity () еще не готов, как я могу получить ссылку на объект FragmentActivity?
CeccoCQ
2
@ Vivek Я не знаю, чего ты хочешь достичь. Если вам нужен фрагмент, чтобы сразу отобразить диалоговое окно, сделайте так, чтобы он делал то, что ему нужно, при создании, например, в его onCreateViewили onActivityCreatedметодах. Я спрашиваю, почему asd () нужно вызывать, когда это происходит при публикации вопросов.
PJL
3
onAttach устарела
abbasalim
6
onAttach (Activity mActivity), кажется, обесценивается .. любой обходной путь для этого
ashish.n
4
API 24 введенcommitNow()
Николас