Estoy teniendo problemas para conseguir un AlertDialog para pasar texto a la actividad a la que llama. Parece que el problema es que no logra encontrar la adecuada EditText cuando se llama a findViewByID, pero soy nuevo en Android y no sabes por qué puede ser.

El código es el siguiente:

public class ModifyDialogFragment extends DialogFragment {

/* The activity that creates an instance of this dialog fragment must
 * implement this interface in order to receive event callbacks.
 * Each method passes the DialogFragment in case the host needs to query it. */
public interface MDialogListener {
    public void onMDialogPositiveClick(String newValue);
}

//Use this instance of the interface to deliver action events
MDialogListener mListener;

String mEntryName = "";
EditText mEditText;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    //Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();

    final View modifyView = inflater.inflate(R.layout.modify_dialog, null);

    builder.setView(modifyView);

    final EditText editText = (EditText) getActivity().findViewById(R.id.modificationText);



           builder.setPositiveButton(R.string.modify, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   mListener.onMDialogPositiveClick(editText.getText().toString());
               }
           });
           builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   //User cancelled the dialog
               }
           });

    //Create the AlertDialog object and return it
    return builder.create();
}

//Override the Fragment.onAttach() method to instantiate the ModifyDeleteDialogListener
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    //Verify that the host activity implements the callback interface
    try {
        //Instantiate the MDDialogListener so we can send events to the host
        mListener = (MDialogListener) activity;
    } catch (ClassCastException e) {
        //The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement MDialogListener");
    }
}

Y la correspondiente modify_dialog.xml:

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

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/modificationText"
    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"/>

¿Por qué no el editText ser encontrado? ¿Qué puedo hacer para que esto funcione como se pretende, pasando la nueva cadena a la actividad?

OriginalEl autor Steve Schwarcz | 2013-09-18

4 Comentarios

  1. 9

    Cambio

    final EditText editText = (EditText) getActivity().findViewById(R.id.modificationText);

    a

    final EditText editText = (EditText) modifyView.findViewById(R.id.modificationText);

    Su EditText vive en modify_dialog.xml por lo que necesita utilizar la variable que se infla con que layout (aquí modifyView) para encontrar el id no la layout que getActivty() va a buscar en.

    Gracias. Trabajó como un encanto.
    Usted es la mayoría de la recepción. Sólo asegúrese de que usted entiende porque que es
    de la misma incluso si se utiliza un cuadro de diálogo personalizado. en ese caso, usted tendrá que utilizar el objeto de diálogo para inicializar sus puntos de vista. @SteveTheSteveSchwarcz aceptar esta respuesta si ayuda

    OriginalEl autor codeMagic

  2. 2

    Su inflar un diseño y se builder.setView(modifyView);

    Para inicializar edittext reemplazar

     final EditText editText = (EditText)getActivity().findViewById(R.id.modificationText);

    por

     final EditText editText = (EditText) modifyViewfindViewById(R.id.modificationText);

    findViewById busca una vista con id siempre en la actual inflado de diseño. Usted no necesita getActivity en lugar de utilizar theinflated objeto de la vista para inicializar el EditText.

    public final Activity getActivity ()
    
    Added in API level 11
    Return the Activity this fragment is currently associated with.

    OriginalEl autor Raghunandan

  3. 1

    Eso es porque estás buscando el punto de vista de la actividad, trate de usar modifyView.findView…

    OriginalEl autor Alvaro Ardila

  4. 0

    Sólo este

    EditText editText = (EditText) modifyView.findViewById(R.id.modificationText);

    ¿Cuál fue el problema?

    De la actividad que acaba de findViewById cualquier vista en la que desea que se refiere a la actividad de diseño.
    Pero en dialog, dialogFragments, o vistas personalizadas que usted tiene que hacer referencia al diseño actual de forma manual, como

    view.findViewById(...)

    Como su código se refería a su actividad principal, de modo que la aplicación tratado de encontrar el id de la actividad, pero en realidad su id pertenece a su vista personalizada modifyView.

    Así que esta es la manera correcta para el código para encontrar el id.

    OriginalEl autor Khemraj

Dejar respuesta

Please enter your comment!
Please enter your name here