Как убедиться, что getActivity () не возвращает ноль? - PullRequest
1 голос
/ 15 апреля 2020

Я новичок во фрагментах и ​​пытаюсь выполнить действие и преобразовать его во фрагмент. Многим вещам, которые я использую, нужен Context, и когда я использую getActivity (), я получаю журнал предупреждений о том, что он может возвращать null, и я не уверен, как это исправить. Я прочитал, что должен как-то прикрепить фрагмент к упражнению, но я не уверен. Я в основном использую одно действие и собираюсь иметь 4 фрагмента, потому что я хочу использовать навигационный ящик.

Это основное действие для показа фрагментов

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.nav_calendar:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new CalendarFragment()).commit();
            break;
        case R.id.nav_survey:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SurveyFragment()).commit();
            break;
        case R.id.nav_forum:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ForumFragment()).commit();
            break;
        case R.id.nav_logout:
            logout();
            break;
        case R.id.nav_contact:
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ContactFragment()).commit();
            break;
    }

    drawer.closeDrawer(GravityCompat.START);
    return true;
}

И во фрагментах onCreateView () у меня есть это, у меня много методов, и большинство из них используют Context, я добавил оператор if из-за того же предупреждения, и это, похоже, сработало, но как мне позаботиться об остальном при использовании Context. Я не вижу, чтобы утверждение if для каждого раза было хорошим делом.

View view = inflater.inflate(R.layout.fragment_calendar, container, false);

if (getActivity() != null) {
    ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.calendar);
}

AndroidThreeTen.init(getActivity());
initialBuild(view);
buildCalendarView();
setRecyclerView();


return view;

Редактировать

Похожие изображения

Также я пытался без @NonNull enter image description here

enter image description here

1 Ответ

1 голос
/ 15 апреля 2020

См. https://www.reddit.com/r/androiddev/comments/aklpz4/why_does_getactivity_in_fragment_might_be_null/.

Вы можете использовать onActivityCreated() для доступа к getActivity(), оно не будет нулевым. Я обычно использую onCreate() или onCreateView() для получения getActivity(), но в некоторых редких случаях представление фрагмента может быть создано до хостинга при запуске приложения (но я не Запомните это в реальной работе).

В любом случае getActivity() помечен как Nullable, так что вы можете сравнить его с null в любом случае.

ОБНОВЛЕНИЕ 1

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

Между onAttach() и onDetach() вы можете получить getActivity(), поэтому сохраняйте контекст в onAttach() и позже используйте его в onCreateView().

ОБНОВЛЕНИЕ 2

Фрагмент:

private Activity activity;

@Override
public void onAttach(Context context) {
    super.onAttach(activity);
    if (context instanceof Activity){
        activity = (Activity) context;
    }
}

@Override
public void onDetach() {
    super.onDetach();
    activity = null;
}

@Override
public void onCreateView() {
    // Use activity here.
}

ОБНОВЛЕНИЕ 3

Извините,

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    if (context instanceof Activity){
        activity = (Activity) context;
    }
}
...