【问题标题】:java.lang.IllegalStateException: Fragment already added :java.lang.IllegalStateException:已添加片段:
【发布时间】:2020-01-28 02:00:24
【问题描述】:

所以我有一个 BottomNavigation,在某个菜单中有另一个 TabLayout,当我单击该菜单时,它让我像标题一样出错。 这是我的代码

FavoriteFragment

BottomNavigation 中包含片段

public class FavoriteFragment extends Fragment {

public FavoriteFragment() {
    // Required empty public constructor
}


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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_favorite, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ViewPager viewPager = view.findViewById(R.id.view_pager);
    setViewPager(viewPager);

    TabLayout tabLayout = view.findViewById(R.id.tab_layout_favorite);
    tabLayout.setupWithViewPager(viewPager);
}

private void setViewPager(ViewPager viewPager){
    SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());

    sectionsPagerAdapter.addFragment(new MoviesFavoriteFragment(),getResources().getString(R.string.title_movies));
    sectionsPagerAdapter.addFragment(new TvShowFavoriteFragment(),getResources().getString(R.string.title_tv_show));
    viewPager.setAdapter(sectionsPagerAdapter);
}
}

我为我的 ViewPager 获得了 pageradapter

SectionsPagerAdapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> listFragment = new ArrayList<>();
    private List<String> titleFragment = new ArrayList<>();

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}

@NonNull
@Override
public Fragment getItem(int position) {
    return listFragment.get(position);
}

@Override
public int getCount() {
    return listFragment.size();
}

public void addFragment(Fragment fragment, String title){
    listFragment.add(fragment);
    titleFragment.add(title);
}

@Override
public CharSequence getPageTitle(int position) {
    return titleFragment.get(position);
}
}

这是 TabLayout 中出现错误的一些片段

MoviesFavoriteFragment

public class MoviesFavoriteFragment extends Fragment {
private RecyclerAdapterFavMovies adapterFavMovies;

public MoviesFavoriteFragment() {
    // Required empty public constructor
}



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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_movies_favorite, container, false);


}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    RecyclerView rv_fav_movie = view.findViewById(R.id.rv_fav_movies);
    rv_fav_movie.setHasFixedSize(true);

    rv_fav_movie.setLayoutManager(new LinearLayoutManager(view.getContext()));

    adapterFavMovies = new RecyclerAdapterFavMovies(view.getContext());
    rv_fav_movie.setAdapter(adapterFavMovies);

    ArrayList<Movies> listMovie = (ArrayList<Movies>) loadDataFavoriteMovies();

    MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
    mainViewModel.setFavMovies(listMovie);
    mainViewModel.getMovieList().observe(getViewLifecycleOwner(),getMovies);
}

private List<Movies> loadDataFavoriteMovies(){
    MovieDatabase database = Room.databaseBuilder(Objects.requireNonNull(getActivity()), MovieDatabase.class, "db_movie")
            .allowMainThreadQueries()
            .build();
    MovieDAO movieDAO = database.getMovieDAO();
    return movieDAO.getMoviesByMovieType(1);
}

private Observer<ArrayList<Movies>> getMovies = new Observer<ArrayList<Movies>>() {
    @Override
    public void onChanged(@Nullable ArrayList<Movies> movies) {
        if (movies != null) {
            adapterFavMovies.setListMovies(movies);
        }
    }
};
}

我不知道当我再次打开我的android studio时突然出现错误,以前什么都没有发生,它工作正常

【问题讨论】:

    标签: java android fragment bottomnavigationview


    【解决方案1】:

    也许文档不清楚,但您应该始终从适配器中的getItem 返回一个新的片段实例。在FragmentPagerAdapter内部,instantiateItem负责返回一个fragment,如果需要,它需要一个新的fragment实例:

    // Do we already have this fragment?
    String name = makeFragmentName(container.getId(), itemId);
    Fragment fragment = mFragmentManager.findFragmentByTag(name);
    if (fragment != null) {
        if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
        mCurTransaction.attach(fragment);
    } else {
        fragment = getItem(position);
        if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
        mCurTransaction.add(container.getId(), fragment,
                makeFragmentName(container.getId(), itemId));
    }
    

    在您的适配器中,getItem 将始终返回相同的片段实例。直到当适配器第二次调用它时片段被销毁,这最终会导致IllegalStateException

    以下是如何修复适配器的示例:

    public Fragment getItem(int position) {
        switch (position) {
            case 0: return MoviesFavoriteFragment();
            case 1: return TvShowFavoriteFragment();
        }
    }
    
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0: return getResources().getString(R.string.title_movies);
            case 1: return getResources().getString(R.string.title_tv_show);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2011-09-09
      相关资源
      最近更新 更多