[英]java.lang.IllegalStateException: Fragment already added :
所以我有一個BottomNavigation,在某些菜單中有另一個TabLayout,當我單擊該菜單時,它出現了標題之類的錯誤。 這是我的代碼
最喜歡的片段
其中包含 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 中出現錯誤的一些片段
電影最喜歡的片段
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 時它突然給我一個錯誤,以前什么也沒發生,它工作正常
也許文檔不清楚,但您應該始終從適配器中的getItem
返回一個新的片段實例。 在FragmentPagerAdapter內部, instantiateItem
負責返回一個片段,如果需要,它需要一個新的片段實例:
// 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.