android - oncreatedialog - import dialogfragment
¿Cómo mostrar AlertDialog en un fragmento? (7)
Quiero mostrar un cuadro de diálogo de alerta en mi aplicación. Estoy usando fragmentos. Intenté el siguiente código para hacer esto:
AlertDialog ad = new AlertDialog.Builder(context)
.create();
ad.setCancelable(false);
ad.setTitle(title);
ad.setMessage(message);
ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
ad.show();
pero estaba fallando y el error en logcat fue:
04-18 15: 23: 01.770: E / AndroidRuntime (9424): android.view.WindowManager $ BadTokenException: No se puede agregar la ventana: el token null no es para una aplicación
Desde internet llegué a saber que la falla se debe a un problema de contexto. Le había dado contexto como
context = this.getActivity().getApplicationContext();
No sé cuál es el problema con esto. Alguien puede ayudarme?
He tenido problemas similares en los que intentaba crear un AlertDialog desde un Fragmento. Una NullPointerException surgió de ella. Inicialmente hice lo siguiente:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
La alertDialog.show()
NullPointerException
produjo específicamente al llamar a alertDialog.show()
más adelante en el código. Pero después de buscar en la documentación de AlertDialog.Builder()
, parecía haber otra forma de inicializarlo [AlertDialog.Builder Doc] , que es incluir un tema / resultado como se muestra a continuación:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();
Esto resolvió la NullPointerException
a la mano. Espero que esto te ayude también!
Lo usé en un adaptador dentro de listView, por lo tanto no pude usar getActivity()
. Para que funcione, utilicé getActivity()
para el contexto en la creación de instancias del adaptador en el fragmento:
this.adapter = new myAdapter(getActivity(), factory);
Más adelante en la otra clase (la clase del adaptador) pude usar getContext()
y funcionó.
Puedes probar esto o usar DialogFragment
private void showAlert(final int position) {
new AlertDialog.Builder(getActivity().getApplicationContext())
.setTitle("Delete entry")
.setMessage("Are you sure you want to delete this entry?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// deleteSuggestions(position);
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
Reemplaza el context
con getActivity()
.
ApplicationContext
no debe utilizarse para tareas como la creación de diálogos. Como está en un fragmento, puede obtener el contexto de actividad simplemente llamando al método getActivity()
Fragments.
Trate de usar DialogFragment, DialogFragment es mejor cuando usa Fragmentos
Más información sobre esta pregunta (AlertDialog en un fragmento, administrado dentro de un evento):
Si llama a AlertDialog dentro de un evento como onClick (View v) o onLongClick (View v) puede usar
public boolean onClick(View v) {
...
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
...
}
AlertDialog alert= null;
AlertDialog.Builder build= new AlertDialog.Builder(getActivity());
build.setTitle("title");
build.setItems(stringarrayname, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//Toast.makeText(getActivity(), "hi", Toast.LENGTH_SHORT).show();
}
});
build.create().show();