Autore Topic: Alertdialog con layout personalizzato: errore!  (Letto 1342 volte)

Offline sika

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg P500 (Optimus One)
  • Sistema operativo:
    OSX 10.6
Alertdialog con layout personalizzato: errore!
« il: 06 Luglio 2012, 09:26:47 CEST »
0
Ciao,
ho una domanda: alla pressione di un tasto, la mia app costruisce un alertdialog con layout personalizzato.
Per customizzarlo ho seguito la guida ufficiale ( Dialogs | Android Developers ); al primo click l'alert viene correttamente lanciato; al secondo click del bottone, l'app crasha, riportandomi quest'errore:

Codice: [Seleziona]
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Poichè di alertdialog ne ho già creati e tutti perfettamente funzionanti, la cosa ha iniziato a puzzarmi, e ho scoperto che ho quest'errore solo se setto la view personalizzata al builder (builder.setView(dialogLayout)).

Che pezzo per perdo per strada??

grazie ;-)

Offline Vlad

  • Utente normale
  • ***
  • Post: 271
  • Respect: +16
    • Github
    • Google+
    • vmihalachi
    • vmihalachi
    • Mostra profilo
    • vmihalachi.com
  • Dispositivo Android:
    Samsung galaxy s2 | Samsung galaxy tab 7
  • Play Store ID:
    Vlad Mihalachi
  • Sistema operativo:
    Windows 8
Re:Alertdialog con layout personalizzato: errore!
« Risposta #1 il: 06 Luglio 2012, 15:13:01 CEST »
0
hai fatto dismis ?

Offline sika

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg P500 (Optimus One)
  • Sistema operativo:
    OSX 10.6
Re:Alertdialog con layout personalizzato: errore!
« Risposta #2 il: 06 Luglio 2012, 15:36:01 CEST »
0
provato sia con la cancel che con la dismiss...ma nada

Offline ivanp

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy next turbo, Samsung Galaxy note
  • Play Store ID:
    Shakesoft
  • Sistema operativo:
    Win 7; Centos 6.2
Re:Alertdialog con layout personalizzato: errore!
« Risposta #3 il: 17 Luglio 2012, 17:47:15 CEST »
0
Codice?  :-)

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:Alertdialog con layout personalizzato: errore!
« Risposta #4 il: 18 Luglio 2012, 08:34:29 CEST »
0
Quando aggiungi una View ad un layout, devi chiamare il parent di questa view e poi su quest'altra fare removeallchildren.
Quell'errore viene lanciato perchè la View ha 2 parents, perciò devi rimuoverne uno:

Codice (Java): [Seleziona]
View view = findViewById(R.id.id);
view.getParent().removeAllViews();
ilTuoLayout.add(view);


Offline giannign1

  • Utente junior
  • **
  • Post: 85
  • Respect: +2
    • chiedetelo_se_lo_volete
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    giannign1
  • Sistema operativo:
    Windows 7
Re:Alertdialog con layout personalizzato: errore!
« Risposta #5 il: 16 Novembre 2012, 19:33:21 CET »
0
Ciao
ho lo stesso problema di Sika.

Penso bene di avere capito il motivo.

Da una parte all'apertura dell'activity faccio inflate del layout:
Codice (Java): [Seleziona]
RemoteMultiplayBridge.LAYOUT = (LinearLayout)LayoutInflater
                                                .from(StaticGlobal.mActivity)
                                                .inflate(R.layout.oppolistlayout, null);
E questo viene quindi fatto una volta solo mentre l'alert viene aperto più volte col seguente codice
Codice (Java): [Seleziona]
RemoteMultiplayBridge.DIALOG = new AlertDialog.Builder(StaticGlobal.mActivity)
                                .setIcon(R.drawable.icon)
                                .setTitle(R.string.oppoListTitle)
                                .setView(RemoteMultiplayBridge.LAYOUT)
                                .setCancelable(false)
                                .setNegativeButton("Back", new OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface arg0, int arg1) {
                                                        RemoteMultiplayBridge.DIALOG.dismiss();
                                                        RemoteMultiplayBridge.LIST_OPENED = false;
                                                        StaticGlobal.mActiveScene.back();                      
                                                }
                                })
                               
                                .show();

Dunque preciso che vorrei non dovere inflatare il layout ad ogni apertura dell'alert perche continene dei listview popolati a runtime che non vorrei ogni volta quindi ripopolare anche quelli, assegnare di nuovo i listener e gli adapter ecc ecc


Come posso fare a levare il parent dal mio layout?
Ho provato con
Codice (Java): [Seleziona]
RemoteMultiplayBridge.LAYOUT.getParent() ma l'oggetto che ottengo non espone alcun metodo removeChild()....
Neanche con vari cast
Codice (Java): [Seleziona]
((View)RemoteMultiplayBridge.LAYOUT).getParent()
Codice (Java): [Seleziona]
((View)RemoteMultiplayBridge.LAYOUT.getParent())

Idee?
Grazie

Gianni

Offline giannign1

  • Utente junior
  • **
  • Post: 85
  • Respect: +2
    • chiedetelo_se_lo_volete
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    giannign1
  • Sistema operativo:
    Windows 7
Re:Alertdialog con layout personalizzato: errore!
« Risposta #6 il: 16 Novembre 2012, 20:13:48 CET »
0
Ho risolto con un archebugio:

Prima dell'alert metto il mio layout come child di un nuovo layout ogni volta nuovo e passo quello all'alertdialog


Codice (Java): [Seleziona]
final LinearLayout popLay = new LinearLayout(StaticGlobal.mActivity);
popLay.addView(RemoteMultiplayBridge.LAYOUT);

RemoteMultiplayBridge.DIALOG = new AlertDialog.Builder(StaticGlobal.mActivity.setPromptMode(true))
                                .setView(popLay).show();

Però se qualcuno sa darmi una soluzione più pulita sarà ben accetta :)