2012-04-18 24 views
48

Quiero mostrar un cuadro de diálogo de alerta en mi aplicación. Estoy usando fragmentos. He probado el código de abajo para hacer esto:¿Cómo mostrar AlertDialog en un fragmento?

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 era:

04-18 15: 23: 01,770: E/Android Runtime (9424): androide .view.WindowManager $ BadTokenException: no se puede agregar la ventana - token null no es para una aplicación

Desde Internet supe que el bloqueo se debe a un problema de contexto. He dado contexto como

context = this.getActivity().getApplicationContext(); 

No sé cuál es el problema con esto. Alguien puede ayudarme?

Respuesta

113

Reemplazar context con getActivity().

El ApplicationContext no debe utilizarse para tareas tales como la creación de cuadros de diálogo. Como se encuentra en un fragmento, puede obtener el Contexto de actividad simplemente llamando al método Fragments getActivity().

+1

Qué debería hacer si getActivity() ¿es nulo? –

+2

@SujithPt Cuando 'getActivity()' devuelve nulo, significa que el fragmento no está adjunto a la actividad y no debe mostrar ningún cuadro de diálogo. – Mousa

7

Intente utilizar DialogFragment, DialogFragment es mejor cuando se utiliza fragmentos

+0

¿Puedes publicar un código de muestra para eso?esta es la primera vez que escucho sobre DialogFragment –

+1

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.html – FUBUs

0

Lo usé en un adaptador dentro de un listView, por lo tanto no pude usar getActivity(). Con el fin de hacer que funcione Solía ​​getActivity() para el contexto en la creación de instancias del adaptador en el fragmento:

this.adapter = new myAdapter(getActivity(), factory); 

Más tarde, en la otra clase (clase del adaptador) pude usar getContext() y funcionó.

9

más información sobre esta cuestión (AlertDialog en un fragmento, gestionado dentro de un evento):

Si llama AlertDialog dentro de un evento como onClick (Ver v) o onLongClick (Ver v) se puede utilizar

public boolean onClick(View v) { 
    ... 
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext()); 
    ... 
} 
-1
     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(); 
+0

recibí el diálogo de alerta utilizando este código en fragmentos – udaysagar

+0

este código es incorrecto, debe usar alert = build.create(); alert.show(); –

-1

puede probar esto o utilizar 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(); 
    } 
1

Tuve problemas similares cuando intentaba crear un AlertDialog desde un Fragmento. Una NullPointerException surgió de él. Al principio lo hice de la siguiente manera:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create(); 

El NullPointerException ocurrió específicamente al llamar alertDialog.show() más adelante en el código. Pero después de buscar la documentación de AlertDialog.Builder(), no parecía haber otra manera de inicializarlo [AlertDialog.Builder Doc], que es incluir un tema/Resid como se muestra a continuación:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create(); 

Esto resuelve el NullPointerException a mano. Espero que esto te ayude también!

Cuestiones relacionadas