Tengo una aplicación con un AlertDialog que muestra una sola EditText. He seguido los desarrolladores de Android guía de hacerlo, pero no puedo encontrar la manera de obtener los datos introducidos por el usuario.

El diseño personalizado sólo tiene un EditText:

<EditText
    android:id="@+id/license_value"
    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/license" />

Estoy usando un DialogFragment para crear el diálogo. Para obtener los datos cuando el usuario hace clic en el botón ok estoy usando una interfaz.

public class EditLicenseDialogFragment extends DialogFragment {
public interface EditLicenseDialogListener {
public void onDialogPositiveClick(DialogFragment dialog, String value);
}
private EditLicenseDialogListener mListener;
//Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//Verify that the host activity implements the callback interface
try {
//Instantiate the NoticeDialogListener so we can send events to the host
mListener = (EditLicenseDialogListener) activity;
} catch (ClassCastException e) {
//The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString()
+ " must implement NoticeDialogListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.new_license);
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.edit_license, null))
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
//GET VALUE. HOW TO DO IT?
EditText valueView = (EditText) getActivity().findViewById(R.id.license_value);
if(valueView == null) Log.d("AA", "NULL");
else{
String value = valueView.getText().toString();
mListener.onDialogPositiveClick(EditLicenseDialogFragment.this, value);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
EditLicenseDialogFragment.this.getDialog().cancel();
}
}); 
return builder.create();
}
}

En mi actividad tengo que hacer lo siguiente:

public class LicenseListActivity extends FragmentActivity 
implements EditLicenseDialogFragment.EditLicenseDialogListener{
...
findViewById(R.id.buttonAddLicense).setOnClickListener(
new View.OnClickListener() {
public void onClick(View view) {
DialogFragment dialog = new EditLicenseDialogFragment(true);
dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment");
}
});
@Override
public void onDialogPositiveClick(DialogFragment dialog, String value) {
Log.d("TAG", value);
}

El EditText trato de recuperar dentro de la DialogFragment siempre es NULL. ¿Cómo puedo obtener el valor de la EditText?

Gracias!

OriginalEl autor PX Developer | 2013-02-12

1 Comentario

  1. 23

    Creo que es porque la vista en la que usted está tratando de encontrar su edittext no es correcto.

    Debería ser algo como esto:

    LayoutInflater inflater = getActivity().getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.edit_license, null);
    builder.setView(dialogView)
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int id) {
    EditText valueView = (EditText) dialogView.findViewById(R.id.license_value); //here
    if(valueView == null) Log.d("AA", "NULL");
    else{
    String value = valueView.getText().toString();
    mListener.onDialogPositiveClick(EditLicenseDialogFragment.this, value);
    }
    })
    Que era él. Gracias!
    He probado esto, pero en la línea, donde valueView se inicializa, el compilador me da un error: «No puede referirse a un no-final de la variable diag_view dentro de una clase interna definida en un método diferente». Si hago dialogView una última variable, no será cambiado y nada puede ser recuperada a partir de ella.
    Así, declarar View dialogView fuera de un método, como un campo de clase.
    Es necesario declarar dialogView como final -> final View dialogView = inflater.inflate(R.layout.edit_license, null);. Sólo entonces se puede usar dentro de clase anónima OnClickListener.

    OriginalEl autor Michał Z.

Dejar respuesta

Please enter your comment!
Please enter your name here