2012-04-18 6 views
48

Desidero visualizzare una finestra di avviso nella mia app. Sto usando frammenti. Ho provato il codice qui sotto per fare questo:Come visualizzare AlertDialog in un frammento?

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(); 

ma era che si infrangono e l'errore in logcat rimasto:

04-18 15: 23: 01,770: E/AndroidRuntime (9424): Android .view.WindowManager $ BadTokenException: Impossibile aggiungere finestra - nulla pedina non è per un'applicazione

da Internet sono venuto a sapere che l'incidente è dovuto al contesto problema. Avevo dato contesto come

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

Non so quale sia il problema con questo. Qualcuno può aiutarmi?

risposta

113

Sostituire context con getActivity().

Il ApplicationContext non deve essere utilizzato per attività come la creazione di finestre di dialogo. Mentre ti trovi in ​​un frammento puoi invece ottenere il Contesto di attività semplicemente chiamando il metodo Fragments getActivity().

+1

Cosa dovrebbe fare se getActivity() è zero? –

+2

@SujithPt Quando 'getActivity()' restituisce null, significa che il frammento non è associato all'attività e non è necessario mostrare alcuna finestra di dialogo. – Mousa

7

Tenta di utilizzare DialogFragment, DialogFragment è migliore quando si utilizza Frammenti

+0

puoi inserire un codice di esempio?questa è la prima volta che sento parlare di DialogFragment –

+1

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

0

L'ho usato in un adattatore all'interno di un listView, quindi non ho potuto usare getActivity(). Al fine di farlo funzionare ho usato getActivity() per il contesto in l'istanza dell'adattatore nel frammento:

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

Più tardi nel altra classe (classe dell'adattatore) sono stato in grado di utilizzare getContext() e ha funzionato.

9

Ulteriori informazioni su questa questione (AlertDialog in un frammento, gestito all'interno di un evento):

Se si chiama AlertDialog all'interno di una manifestazione come onclick (Visualizza v) o onLongClick (Visualizza v) è possibile utilizzare

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

ho ottenuto la finestra di avviso usando questo codice in frammenti – udaysagar

+0

questo codice è sbagliato, dovresti usare alert = build.create(); alert.show(); –

-1

Si può provare questo o utilizzare 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

Ho avuto problemi simili per cui stavo cercando di creare un AlertDialog da un frammento. Ne è nata una NullPointerException. Inizialmente ho fatto come segue:

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

Il NullPointerException si è verificato in particolare al momento della chiamata alertDialog.show() in seguito nel codice. Ma dopo aver cercato la documentazione per AlertDialog.Builder(), sembrava che ci fosse un altro modo per inizializzare [AlertDialog.Builder Doc], che è quello di includere un tema/resid come illustrato di seguito:

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

Questo risolto il NullPointerException a portata di mano. Spero che questo ti aiuti pure!