让“特定的孩子已经有了父母。”

时间:2016-06-08 05:09:06

标签: android android-fragments android-recyclerview

我已尝试过所有stackoverflow论坛但无法获得解决方案

错误日志:

06-08 10:02:24.116 18960-18960/com.example.itachiuchiha.crimeintent E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.itachiuchiha.crimeintent, PID: 18960
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.itachiuchiha.crimeintent/com.example.itachiuchiha.crimeintent.CrimeListActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2357)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2419)
  at android.app.ActivityThread.access$900(ActivityThread.java:154)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:135)
  at android.app.ActivityThread.main(ActivityThread.java:5293)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
Caused by: 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:3937)
  at android.view.ViewGroup.addView(ViewGroup.java:3787)
  at android.view.ViewGroup.addView(ViewGroup.java:3728)
  at android.view.ViewGroup.addView(ViewGroup.java:3701)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
  at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339)
  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:601)
  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
  at android.app.Activity.performStart(Activity.java:6006)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2320)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2419) 
  at android.app.ActivityThread.access$900(ActivityThread.java:154) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:135) 
  at android.app.ActivityThread.main(ActivityThread.java:5293) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at java.lang.reflect.Method.invoke(Method.java:372) 
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)  06-08 10:02:25.528 18960-18960/com.example.itachiuchiha.crimeintent I/Process: Sending signal. PID: 18960 SIG: 9

CrimeListActivity类:

    package com.example.itachiuchiha.crimeintent;

   import android.support.v4.app.Fragment;

    public class CrimeListActivity extends SingleFragmentActivity {
        @Override
        protected Fragment createFragment() {
            return new CrimeListFragment();
        }
    }

CrimeListFragment类:

    package com.example.itachiuchiha.crimeintent;

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    //import android.widget.CheckBox;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.util.List;


    public class CrimeListFragment extends Fragment {
        public RecyclerView recyclerView;
        public CrimeAdapter crimeAdapter;
        @Override
        public View. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
            View view=inflater.inflate(R.layout.fragment_crime_list,container);
                       recyclerView=(RecyclerView)view.findViewById(R.id.crime_recycler_view);
                  recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
             updateUI();
             return view;
         }
         private void updateUI(){
             CrimeLab crimeLab;
              crimeLab =      CrimeLab.get(getActivity());
             List<Crime>      crimes=crimeLab.getCrimeList();
             crimeAdapter=new      CrimeAdapter(crimes);
             recyclerView.setAdapter(crimeAdapter);
         }
         private class CrimeHolder extends     RecyclerView.ViewHolder implements.   View.OnClickListener{
             public TextView titleText;
    //        public TextView dateText;
     //        public CheckBox solvedCheck;
            public Crime crime;
             public CrimeHolder(View itemView){
                 super(itemView);
                    itemView.setOnClickListener(this);
                titleText=(TextView)itemView;//.findViewById(R.id.list_item_crime_title_text_view);
//                     dateText=(TextView)itemView.findViewById(R.id.list_item_crime_date_text_view);
     //            solvedCheck=(CheckBox) itemView.findViewById(R.id.list_item_crime_solved_check_box);

        }
             public void bindCrime(Crime mcrime){
                  crime=mcrime;
                 titleText.setText(crime.getCrimeTitle());
//                dateText.setText(crime.getDate().toString());
//            solvedCheck.setChecked(crime.isSolved());
        }

        @Override
        public void onClick(View vo) {
            Toast.makeText(getActivity(),crime.getCrimeTitle()+"clicked",Toast.LENGTH_SHORT).show();
        }
    }
    private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder>{
        private List<Crime> crimes;
        public CrimeAdapter(List<Crime> crimess){
            crimes=crimess;
        }
        @Override
        public CrimeHolder onCreateViewHolder(ViewGroup parent,int viewType){
            LayoutInflater layoutInflater=LayoutInflater.from(getActivity());
            View vh=layoutInflater.inflate(android.R.layout.simple_list_item_1,parent,false);
            return new CrimeHolder(vh);
        }

        @Override
        public void onBindViewHolder(CrimeHolder holder, int position) {
            Crime crime=crimes.get(position);
            holder.bindCrime(crime);
        }

        @Override
        public int getItemCount() {
            return crimes.size();
        }
    }
}

SingleFragmentActivity类:

package com.example.itachiuchiha.crimeintent;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;


public abstract class SingleFragmentActivity extends FragmentActivity{
    protected abstract Fragment createFragment();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);
        FragmentManager fm=getSupportFragmentManager();
        Fragment fragment=fm.findFragmentById(R.id.fragmet_container);
        if(fragment==null){
            fragment=createFragment();
            fm.beginTransaction().add(R.id.fragmet_container,fragment).commit();
        }

    }
}

犯罪类:

package com.example.itachiuchiha.crimeintent;

import java.util.Date;
import java.util.UUID;

public class Crime {
    public UUID crimeID;
    public String crimeTitle;
    public Date date;
    public boolean isSolved;
    public Crime(){
        crimeID=UUID.randomUUID();
        this.date=new Date();
    }

    public boolean isSolved() {
        return isSolved;
    }

    public void setSolved(boolean solved) {
        isSolved = solved;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }



    public UUID getCrimeID() {
        return crimeID;
    }


    public String getCrimeTitle() {
        return crimeTitle;
    }

    public void setCrimeTitle(String crimeTitle) {
        this.crimeTitle = crimeTitle;
    }
}

CrimeLab类:

  package com.example.itachiuchiha.crimeintent;


    import android.content.Context;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;


    public class CrimeLab {
        public static CrimeLab crimeLab;
        public List<Crime> crimeList;
        public static CrimeLab get(Context context){
            if(crimeLab==null){
                crimeLab=new CrimeLab(context);
            }
            return crimeLab;
        }
        private CrimeLab(Context context){
            crimeList=new ArrayList<>();
            for(int i=0;i<100;i++){
                Crime crime=new Crime();
                crime.setCrimeTitle("Crime #"+i);
                crime.setSolved(i%2==0);
                crimeList.add(crime);
            }
        }
        public List<Crime> getCrimeList(){
            return crimeList;
        }
        public Crime getCrimebyUUID(UUID id){
            for (Crime crime:crimeList){
                if(crime.getCrimeID().equals(id)){
                    return crime;
                }
            }
            return null;
        }
    }

fragment_crime_list.XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/crime_recycler_view">

</android.support.v7.widget.RecyclerView>
</RelativeLayout>

activity_fragment.XML:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragmet_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

如果你能解释为什么会出现这个错误,以及如何对它进行排序,那将会很棒。

1 个答案:

答案 0 :(得分:2)

{p}在onCreateView()试试这个。

inflater.inflate(R.layout.fragment_crime_list, container, false);

根据java文档,第三个参数意味着

  

是否应附加膨胀的层次结构                根参数?如果为false,则root仅用于创建                正确的LayoutParams子类,用于XML中的根视图。