指定的小孩已经有一个父异常 [英] The specified child already has a parent Exception

查看:153
本文介绍了指定的小孩已经有一个父异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用片段在我的code,因为 TabActivity 是德precated但我M收到此错误我的的logcat

I'm using Fragments in my code since TabActivity is deprecated but I'm getting this error in my Logcat:

07-09 09:19:40.936: E/AndroidRuntime(5935): FATAL EXCEPTION: main
07-09 09:19:40.936: E/AndroidRuntime(5935): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.view.ViewGroup.addView(ViewGroup.java:1871)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.view.ViewGroup.addView(ViewGroup.java:1828)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.view.ViewGroup.addView(ViewGroup.java:1808)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:915)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.os.Handler.handleCallback(Handler.java:587)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.os.Looper.loop(Looper.java:130)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at android.app.ActivityThread.main(ActivityThread.java:3691)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at java.lang.reflect.Method.invokeNative(Native Method)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at java.lang.reflect.Method.invoke(Method.java:507)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
07-09 09:19:40.936: E/AndroidRuntime(5935):     at dalvik.system.NativeStart.main(Native Method)

这里是code,我添加标签:

public class RelatorioPontos extends FragmentActivity {

     private FragmentTabHost mTabHost;
     private String id;

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

            setContentView(R.layout.relatorio_layout);
            mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
            mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

            id = getIntent().getStringExtra("idPonto");

            Bundle args = new Bundle();
            args.putString("id", id);

            mTabHost.addTab(mTabHost.newTabSpec("dados").setIndicator("Dados"), DadosPonto.class, args);
            mTabHost.addTab(mTabHost.newTabSpec("analises").setIndicator("Análises"), AnalisesPonto.class, args);
            mTabHost.addTab(mTabHost.newTabSpec("multimidia").setIndicator("Multimídia"), ArquivosMultimidia.class, args);
        }


}

这是第一个选项卡类:

public class DadosPonto extends Fragment{

    Ponto ponto = new Ponto();
    private String id;

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

        id = getArguments().getString("id");

        PontoDAO pdao = new PontoDAO(getActivity().getApplicationContext());
        ponto = pdao.retornaPonto(id);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        if (container == null) {
            return null;
        }

        View view = inflater.inflate(R.layout.dados_ponto_layout, container, false);

        View idPonto = view.findViewById(R.id.idPonto);
        View idUser = view.findViewById(R.id.idUser);
        View pontoNome = view.findViewById(R.id.nomePonto);
        View dtCampo = view.findViewById(R.id.dtCampo);
        View projeto = view.findViewById(R.id.projeto);
        View UTMEste = view.findViewById(R.id.utmEste);
        View UTMNorte = view.findViewById(R.id.utmNorte);
        View UTMFuso = view.findViewById(R.id.utmFuso);
        View UTMHemisferio = view.findViewById(R.id.utmHemisferio);
        View latDec = view.findViewById(R.id.latDec);
        View longDec = view.findViewById(R.id.longDec);
        View altitude = view.findViewById(R.id.altitude);
        View localidade = view.findViewById(R.id.localidade);
        View outrasUG = view.findViewById(R.id.outrasUG);
        View descPonto = view.findViewById(R.id.descPonto);
        View complemento = view.findViewById(R.id.complemento);
        View equipe = view.findViewById(R.id.equipe);
        View fonteUG = view.findViewById(R.id.fonteUG);

        ((TextView) idPonto).setText("Id do ponto: " + ponto.getIdPonto());
        ((TextView) idUser).setText("Id do usuário: " + ponto.getIdUsuario()+"");
        ((TextView) pontoNome).setText("Nome do ponto: " + ponto.getPontoNome());
        ((TextView) dtCampo).setText("Data do campo: " + ponto.getDtCampo());
        ((TextView) projeto).setText("Projeto: " + ponto.getProjeto()+"");
        ((TextView) UTMEste).setText("UTM Este: " + String.valueOf(ponto.getUTMEste()));
        ((TextView) UTMNorte).setText("UTM Norte: " + String.valueOf(ponto.getUTMNorte()));
        ((TextView) UTMFuso).setText("UTM Fuso: " + ponto.getUTMFuso()+"");
        ((TextView) UTMHemisferio).setText("UTM Hemisfério: " + ponto.getUTMHemisferio());
        ((TextView)latDec).setText("Latitude decimal: " + String.valueOf(ponto.getLatDec()));
        ((TextView)longDec).setText("Longitude decimal: " + String.valueOf(ponto.getLongDec()));
        ((TextView)altitude).setText("Altitude: " + ponto.getAltitude()+"");
        ((TextView)localidade).setText("Localidade: " + ponto.getLocalidade());
        ((TextView)outrasUG).setText("Outras Unidades Geológicas: " + ponto.getOutrasUG());
        ((TextView)descPonto).setText("Descrição do ponto: " + ponto.getDescPonto());
        ((TextView)complemento).setText("Complemento da descrição: " + ponto.getComplement());
        ((TextView)equipe).setText("Equipe: " + ponto.getEquipe());
        ((TextView)fonteUG).setText("Fonte da Unidade Geológica: " + ponto.getFonteUG());

        return view;
    }
}

,并在第二个选项卡活动:

public class AnalisesPonto extends ListFragment {

    private ArrayList<AnaliseEstrutural> analises;
    AnalisesDAO andao;
    String idPonto;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        idPonto = getArguments().getString("id");



        if (container == null) {
            return null;
        }

        View lista = inflater.inflate(R.layout.analises_ponto_layout, container, false);

        //ListView analisesList = (ListView) lista.findViewById(android.R.id.list);
        View analisesList = (ListView) lista.findViewById(android.R.id.list);

        andao = new AnalisesDAO(getActivity().getApplicationContext());
        analises = andao.relatorioAnalises(idPonto);

        AnalisesAdapter analisesAdapter = new AnalisesAdapter(getActivity().getApplicationContext());
        for(int j = 0; j < analises.size(); j++) {
            analisesAdapter.add(analises.get(j));
        }

        return analisesList;
    }       
}

第三类code是一样的第二个让我不要在这里发布,第一个选项卡工作得很好,但是当我在第二个进入我得到这个例外。

The third class code is the same as the second one so I'll not post here, the first tab works well but when I enter in the second one I get this exception.

我怀疑是我该怎么处理这个异常?

My doubt is how I can deal with this Exception?

推荐答案

在配置发生变化时,例如屏幕方向最有可能你得到这个异​​常。它抱怨的观点仍连接到previous视图层次,所以你需要删除它,它重新连接到当前之一。

Most probably you are getting this exception when a configuration change occurs, for example a screen orientation. It complains that the view is still attached to the previous view hierarchy, and so you need to remove it and re-attach it to the current one.

public class DadosPonto extends Fragment{

    // Keep a reference to the view; 
    private View view;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.dados_ponto_layout, container, false);
            View idPonto = view.findViewById(R.id.idPonto);
            // .....
        } else {
            // If we are returning from a configuration change:
            // "view" is still attached to the previous view hierarchy
            // so we need to remove it and re-attach it to the current one
            ViewGroup parent = (ViewGroup) view.getParent();
            parent.removeView(view);
        }
        return view;
    }
}

这篇关于指定的小孩已经有一个父异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆