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

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


Я не уверен, была ли просто ошибка, когда вы вставили ее в этот пост, но вам нужно скобки после 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()вызов).


5
Я не понял, как вы можете решить свою проблему. Если мой метод getActivity () еще не готов, как я могу получить ссылку на объект FragmentActivity?
CeccoCQ

2
@ Vivek Я не знаю, чего ты хочешь достичь. Если вам нужен фрагмент, чтобы сразу отобразить диалоговое окно, сделайте так, чтобы он делал то, что ему нужно, при создании, например, в его onCreateViewили onActivityCreatedметодах. Я спрашиваю, почему asd () нужно вызывать, когда это происходит при публикации вопросов.
PJL

3
onAttach устарела
abbasalim

6
onAttach (Activity mActivity), кажется, обесценивается .. любой обходной путь для этого
ashish.n

4
API 24 введенcommitNow()
Николас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.