TabLayout & ViewGroup :指定的孩子已经有一个父母您必须先在孩子的父母上调用 removeView()

问题描述

我的 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

一切都按预期进行。