2012-02-11 12 views
18

Tengo una clase para crear el diálogo y la codificación para obtener los valores de la misma. funciona bien para uno. y cuando trato de llamar al cuadro de diálogo por segunda vez, pasa el siguiente mensaje de error.El hijo especificado ya tiene un padre. Debe llamar a removeView() en el padre del hijo primero

: java.lang.IllegalStateException: El elemento especificado ya tiene un elemento primario. Primero debe llamar a removeView() en el padre del niño.

¿Puede decirme cómo quitar el removeView()?

aquí está el código para la clase;

package com.util; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.widget.EditText; 

/** 
* helper for Prompt-Dialog creation 
*/ 
public abstract class PromptDialog extends AlertDialog.Builder implements OnClickListener { 
private final EditText input; 

/** 
    * @param context 
    * @param title resource id 
    * @param message resource id 
    */ 
public PromptDialog(Context context, int title, int message) { 
    super(context); 
    setTitle(title); 
    //:TODO Display msg only if not empty 
    //setMessage(message); 

    input = new EditText(context); 
    setView(input); 

    setPositiveButton("ok", this); 
    setNegativeButton("cancel", this); 
} 

/** 
    * will be called when "cancel" pressed. 
    * closes the dialog. 
    * can be overridden. 
    * @param dialog 
    */ 
public void onCancelClicked(DialogInterface dialog) { 
    dialog.dismiss(); 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 
    if (which == DialogInterface.BUTTON_POSITIVE) { 
    if (onOkClicked(input.getText().toString())) { 
    dialog.dismiss(); 
    } 
    } else { 
    onCancelClicked(dialog); 
    } 
} 

/** 

     * called when "ok" pressed. 
     * @param input 
     * @return true, if the dialog should be closed. false, if not. 
     */ 
    abstract public boolean onOkClicked(String input); 
    } 

y aquí está el código que llamo la instancia de la clase;

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 



final PromptDialog dlgName = new PromptDialog(this, R.string.enterName, R.string.enter_comment) { 
      @Override 
      public boolean onOkClicked(String input) { 
       // do something 
       mName = input; 
        save(); 
          //end do some thing 
       return true; // true = close dialog 
      } 
     };  


    mTxtShiftName = (TextView) findViewById(R.id.shiftname); 
      mTxtShiftName.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       dlgName.show(); 
      } 
     }); 
+0

¿Está llamando al constructor de diálogo nuevamente en su segundo intento? –

+0

Toda la codificación que estoy usando está copiada en mi pregunta. Creo que esa podría ser la razón. pero no sé cómo evitar esto? – SAN

+0

No llame al constructor dos veces cuando hace clic en el botón. Cree su cuadro de diálogo una vez en 'onCreate' con su constructor Dialog o' onPrepareDailog' con solo un código y luego simplemente llame a dialog.show() cuando quiera mostrarlo. –

Respuesta

1

Usted debe poner el código llamando al constructor de diálogo dentro del método de devolución de llamada en lugar de onCreateDialog(int)onCreate(Bundle). En su código, el diálogo se inicializa implícitamente cuando llama al dlgName.show(). Como resultado, cuando llama al diálogo por segunda vez, también lo hace con el constructor del diálogo.

66

Recibí este error al llamar al método de inflado incorrecto en la llamada a onCreateView() de mi fragmento.

me fijo, cambiando de esta:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_saves, container); 
} 

A esto:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_saves, container, false); 
} 
+1

tío el falso como el último argumento salvó mi vida! ¡Gracias! –

+0

¡dale a ese hombre una medalla! Gracias hombre – Karoly

0

mira esto:

http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int,android.view.ViewGroup,boolean)

En concreto, el argumento booleano y el valor de retorno en el método de inflado de LayoutInflator:

Devuelve La vista raíz de la jerarquía inflada. Si se proporcionó root y attachToRoot es verdadero, esto es root; de lo contrario, es la raíz del archivo XML inflado.

View dialogView = inflater.inflate(R.layout.brush_opts_dialog, rootView, false); 

Usted quiere hacer la raíz de la visión exagerada a ser la vista creada en lugar de "este", lo que sería el fragmento completo dentro de una actividad.

Cuestiones relacionadas