java.lang.IllegalStateException: FragmentManager 已被销毁

Ser*_*man 5 java android android-fragments fragmentmanager

在活动onResume方法中,我调用 volley 请求,它获取项目列表,然后将它们加载到此活动中的 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();
}
Run Code Online (Sandbox Code Playgroud)

在 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,当活动被破坏时 FragmentManager 会被破坏,但是如何为重新创建的活动获取新的 FragmentManager?为什么 getSupportFragmentManager() 不起作用?

lcp*_*nix 16

FragmentManager当您从Activity被销毁的对象中获取时,通常会发生这种情况activity.getSupportFragmentManager();,例如,如果您从另一个类中获取。

对于您的情况,首先检查是否FragmentManager没有被破坏,然后使用它:

FragmentManager fragmentManager = getSupportFragmentManager();

if (!fragmentManager.isDestroyed()) {
    fragmentManager
    .beginTransaction()
    .replace(R.id.artist_activity__albums_container, fragment)
    .commit();
}
Run Code Online (Sandbox Code Playgroud)

  • 在“else”块中编写什么是好的做法?我的意思是,当这个“if”语句不执行时,会发生什么?我应该重建活动或片段管理器? (2认同)

小智 6

您需要检查活动是否仍在运行或已完成

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

 }
Run Code Online (Sandbox Code Playgroud)

该函数将从活动生命周期函数中获取布尔值。我想这对你有用!

  • isFinished 从哪里来? (2认同)

小智 1

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .replace(R.id.artist_activity__albums_container, fragment)
    .commit();
Run Code Online (Sandbox Code Playgroud)

I guess this is how it should ideally be called. You may check once.