java .lang.IllegalStateException: FragmentManager был уничтожен - PullRequest
3 голосов
/ 11 марта 2020

В упражнении onResume метод я вызываю запрос залпа, который получает список элементов, а затем загружает их в ListFragment внутри этого действия. Когда я вхожу в действие в первый раз, все работает правильно, но когда я снова вхожу в действие, ListFragment пуст и в консоли появляется сообщение «FragmentManager был уничтожен».

Это код моей активности:

@Override
protected void onResume() {
    super.onResume();
    // Volley request inside - which call back albumsFoundViewUpdate
    artistController.getArtistAlbums(artist);
}

public void albumsFoundViewUpdate(ArrayList<UserAlbumLink> links)
{
    // Load list fragment
    UserAlbumLinkListFragment fragment = new UserAlbumLinkListFragment(links, artist);
    getSupportFragmentManager().beginTransaction().replace(R.id.artist_activity__albums_container, fragment).commit();
}

Исключение выдается в операторе commit ().

Мой код ListFragment:

public class UserAlbumLinkListFragment extends ListFragment {
    private List<UserAlbumLink> albumLinks;
    private UserAlbumLinkListAdapter adapter;
    private Artist artist;


    public UserAlbumLinkListFragment() {
    }

    public UserAlbumLinkListFragment(List<UserAlbumLink> albumLinks, Artist artist) {
        this.albumLinks = albumLinks;
        this.artist = artist;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        adapter = new UserAlbumLinkListAdapter(getActivity(), R.layout.album_list_item, albumLinks, artist);
        setListAdapter(adapter);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_album_list, container, false);
    }
}

Как я понимаю, FragmentManager уничтожается, когда действие уничтожается, но как получить новый FragmentManager для воссозданной деятельности? Почему getSupportFragmentManager () не работает?

Ответы [ 3 ]

1 голос
/ 11 марта 2020
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .replace(R.id.artist_activity__albums_container, fragment)
    .commit();

Полагаю, так оно и должно быть в идеале. Вы можете проверить один раз.

0 голосов
/ 11 марта 2020

Я совершенно не понял, почему это сработало, но я решил проблему. Я создал переменную активности stati c и инициировал ее с помощью метода onCreate:

private static ArtistActivity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    activity = this;
    ...
}

И я заметил, что в методе albumFoundViewUpdate this.isDestroyed () возвращает true (когда я повторно запускаю это действие во второй раз) и activity.isDestroyed () возвращает false. Итак, я переделал альбомыFoundViewUpdate следующим образом:

public void albumsFoundViewUpdate(ArrayList<UserAlbumLink> links)
{
    // Load list fragment
    UserAlbumLinkListFragment fragment = new UserAlbumLinkListFragment(links, artist);
    FragmentManager fragmentManager = activity.getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.artist_activity__albums_container, fragment).commit();
}

и теперь он работает идеально каждый раз!

0 голосов
/ 11 марта 2020

вам необходимо проверить, выполняется ли действие еще или оно завершено

if(!isFinished()){
 FragmentManager fragmentManager = getSupportFragmentManager();
 fragmentManager.beginTransaction()
.replace(R.id.artist_activity__albums_container, fragment)
.commit();

 }

эта функция получит логическое значение из функций жизненного цикла действия. Я думаю, что это будет работать для вас!

...