问题描述
我的 MainActivity 上有一个 tabLayout 设置 iwth viewpager:
tabLayout.setupWithViewPager(viewPager);
初始片段加载没有任何问题。但是,当单击其中一个选项卡标题时,出现以下错误: “指定的孩子已经有父母。你必须先在孩子的父母上调用 removeView()”
这是我的片段设置:
public class ContactsList extends Fragment {
private static MainActivity mActivity;
private View view;
private static Fragment thisFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = (MainActivity) getActivity();
thisFragment= this;
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.contacts_list_recycler_view,null);
view=v;
RecyclerView rv = (RecyclerView) v.findViewById(R.id.contacts_list_recyclerview);
setupRecyclerView(rv);
return rv;
}
@Override
public void onDestroyView() {
if (view != null) {
ViewGroup group = (ViewGroup) view.getParent();
group.removeAllViews();
}
super.onDestroyView();
}
和 MainActivity 上的 viewpager 适配器:
static class Adapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public Adapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment,String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
Logcat 具有以下功能:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:4976)
at android.view.ViewGroup.addView(ViewGroup.java:4807)
解决方法
好吧,经过 4 小时的错误搜索后发现,错误不在代码上,而是在布局 XML 文件上。加载片段时,最初我有:
df.loc[df.index.isin(valid_indexes,level=0)]
而且看起来 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/contacts_list_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="32dp"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"></androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>
是不允许的,并且会抛出上述错误。
要解决这个问题,只需要从 XML 中删除 constrainLayout
:
constrainLayout
一切都按预期进行。