Autore Topic: Errore "The specified child already has a parent. You must call removeView()"  (Letto 934 volte)

Offline barmo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGS CyanogenMod 9 RC2
  • Sistema operativo:
    Windows 7
Ciao a tutti,
ho un problema che non riesco a risolvere,  sicuramente mi potete aiutare.
Il comportamento  è il seguente:
Alla prima pressione sul bottone nuovo viene creata correttamente la AlertDialog, inserisco il valore richiesto ma poi premendo il tasto indietro sul dispositivo e premendo nuovamente sul bottone "Nuovo" ottengo il messaggio di errore in oggetto.
Ho trovato qualche suggerimento che diceva di usare dismiss() ma non sono riuscito a risolvere.
Questo è la porzione di codice dell'activity incriminata:
Codice (Java): [Seleziona]
/** Called when the activity is first created. */
private AlertDialog.Builder insertName;
        private EditText defaultName;
        private String name;
        private Intent i;      
@Override
        public void onCreate(Bundle savedInstanceState) {
               
                super.onCreate(savedInstanceState);
                setContentView(R.layout.home);

                //Creo il nuovo alertDialog e la EditText per inserimento il nome
                insertName = new AlertDialog.Builder(this);
                defaultName = new EditText(this);

                Button bntNew = (Button)findViewById(R.id.bntNew);
               
                bntNew.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                               
                                i = new Intent(view.getContext(), StopwatchActivity.class);

                                insertName.setTitle("Nome");
                                insertName.setMessage("Inserisci il nome");
                                insertName.setCancelable(false);
                                //Imposto un valore di default alla editText
                                defaultName.setText("No_name");
                                insertName.setView(defaultName);

                                insertName.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int whichButton) {
                                                Editable value = defaultName.getText();
                                                if (value.length() == 0) {
                                                        name="No_name";  
                                                }
                                                else {
                                                        name= value.toString();
                                                }
                                               
                                                i.putExtra("myName", name);

                                                startActivity(i);
                                        }
                                });
                                insertName.show();
                               
                        }
                });
E questo il layout:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:gravity="center_horizontal"
 android:orientation="vertical">
        <TextView
                android:id="@+id/ElapsedTime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="72sp"/>
        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center">
                <Button
                        android:text="Start"
                        android:id="@+id/StartButton"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="36sp"
                        android:paddingLeft="24dip"
                        android:paddingRight="24dip"
                        android:minWidth="150dip"
                        android:onClick="onStartClicked"/>
                <Button
                        android:text="Pause"
                        android:id="@+id/PauseButton"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="36sp"
                        android:paddingLeft="24dip"
                        android:paddingRight="24dip"
                        android:minWidth="150dip"
                        android:onClick="onPauseClicked"
                        android:visibility="gone"/>
                <Button
                        android:text="Reset"
                        android:id="@+id/ResetButton"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="36sp"
                        android:paddingLeft="24dip"
                        android:paddingRight="24dip"
                        android:minWidth="150dip"
                        android:onClick="onResetClicked"/>
                <Button
                        android:text="Lap"
                        android:id="@+id/LapButton"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="36sp"
                        android:paddingLeft="24dip"
                        android:paddingRight="24dip"
                        android:minWidth="150dip"
                        android:onClick="onLapClicked"
                        android:visibility="gone"/>
       
        </LinearLayout>
       
        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center">
        <Button android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/saveButton"
                android:textSize="36sp"
                android:paddingLeft="24dip"
                android:paddingRight="24dip"
                android:minWidth="150dip"
                android:text="@string/save">
         </Button>
         </LinearLayout>
       
        <ListView
                android:id="@+id/android:list"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"/>
        <TextView
                android:id="@+id/android:empty"
                android:text=""
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"/>          
</LinearLayout>
Grazie anticipatamente a chi mi vorrà aiutare.
PS aggiungo anche il log:
Codice: [Seleziona]
07-29 20:38:52.554: D/AndroidRuntime(22882): Shutting down VM
07-29 20:38:52.554: W/dalvikvm(22882): threadid=1: thread exiting with uncaught exception (group=0x40a5a1f8)
07-29 20:38:52.558: E/AndroidRuntime(22882): FATAL EXCEPTION: main
07-29 20:38:52.558: E/AndroidRuntime(22882): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.view.ViewGroup.addViewInner(ViewGroup.java:3337)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.view.ViewGroup.addView(ViewGroup.java:3208)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.view.ViewGroup.addView(ViewGroup.java:3188)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at com.android.internal.app.AlertController.setupView(AlertController.java:401)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at com.android.internal.app.AlertController.installContent(AlertController.java:241)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.app.AlertDialog.onCreate(AlertDialog.java:336)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.app.Dialog.dispatchOnCreate(Dialog.java:353)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.app.Dialog.show(Dialog.java:257)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.contapassi.activity.HomeActivity$1.onClick(HomeActivity.java:91)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.view.View.performClick(View.java:3511)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.view.View$PerformClick.run(View.java:14105)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.os.Handler.handleCallback(Handler.java:605)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.os.Handler.dispatchMessage(Handler.java:92)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.os.Looper.loop(Looper.java:137)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at android.app.ActivityThread.main(ActivityThread.java:4575)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at java.lang.reflect.Method.invokeNative(Native Method)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at java.lang.reflect.Method.invoke(Method.java:511)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
07-29 20:38:52.558: E/AndroidRuntime(22882):         at dalvik.system.NativeStart.main(Native Method)
Buona serata,
barmo
« Ultima modifica: 29 Luglio 2012, 22:35:41 CEST da barmo »

Offline barmo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGS CyanogenMod 9 RC2
  • Sistema operativo:
    Windows 7
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #1 il: 30 Luglio 2012, 19:58:59 CEST »
0
Posso aggiungere qualche altra informazione che può essere di aiuto per individuare il problema?
Grazie,
Buona serata,
barmo

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #2 il: 30 Luglio 2012, 20:51:57 CEST »
0
Qual'è esattamente la linea 91?

Offline barmo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGS CyanogenMod 9 RC2
  • Sistema operativo:
    Windows 7
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #3 il: 30 Luglio 2012, 21:10:04 CEST »
0
Prima di tutto grazie per la risposta.
Hai ragione, dal listato non si vede, la riga 91 , quella che genera errore è:
insertName.show();
barmo
Qual'è esattamente la linea 91?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #4 il: 30 Luglio 2012, 21:26:04 CEST »
0
Giusto per curiosità, prova a commentare queste linee:

Codice (Java): [Seleziona]
                                insertName.setView(defaultName);

                                insertName.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int whichButton) {
                                                Editable value = defaultName.getText();
                                                if (value.length() == 0) {
                                                        name="No_name";  
                                                }
                                                else {
                                                        name= value.toString();
                                                }
                                               
                                                i.putExtra("myName", name);

                                                startActivity(i);
                                        }
                                });

Vediamo se è proprio questo il problema....
« Ultima modifica: 30 Luglio 2012, 21:28:48 CEST da Ricky` »

Offline barmo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGS CyanogenMod 9 RC2
  • Sistema operativo:
    Windows 7
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #5 il: 30 Luglio 2012, 21:36:46 CEST »
0
Ho commentato le righe indicate da Ricky, in questo modo non viene più mostrata la AlertDialog insertName e non viene sollevato alcun errore.
Per specificare uso questa alertDialog per recuperare una stringa che poi setto come title nella activity richiamata da quel bottone.
Barmo
« Ultima modifica: 30 Luglio 2012, 21:39:15 CEST da barmo »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #6 il: 31 Luglio 2012, 09:49:14 CEST »
+1
Ti posto il codice di come ho creato io un dialog con all'interno un EditText.
Invece di creare il layout programmaticamente l'ho però creato da xml (sostanzialmente il file new_user.xml ha dentro un EditText con id @+id/et_user_name)

Codice (Java): [Seleziona]
new AlertDialog.Builder(TuaActivity.this).setIcon(android.R.drawable.ic_dialog_info)
        .setTitle(R.string.add_user)
        .setView(LayoutInflater.from(TuaActivity.this).inflate(R.layout.new_user, null))
        .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                EditText etUsername = (EditText) ((AlertDialog) dialog)
                        .findViewById(R.id.et_user_name);
                String username = etUsername.getText().toString();
                                //Fai quello che devi con la stringa
                dismiss();
            }
        }).show();

Prova a vedere se magari creandolo in questo modo funziona ;)

Offline barmo

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGS CyanogenMod 9 RC2
  • Sistema operativo:
    Windows 7
Re:Errore "The specified child already has a parent. You must call removeView()"
« Risposta #7 il: 02 Agosto 2012, 22:01:09 CEST »
0
Eccomi di ritorno!
Il suggerimento di Ricky è stato prezioso, partendo dal codice da lui fornito sono riuscito ad aggirare il problema!
Grazie,
a presto  :-)
barmo