2013-03-01 9 views
6

Sto tentando di creare un AlertDialog, utilizzando il Generatore e impostando una visualizzazione personalizzata. Quando provo a gonfiare a vista all'interno di onCreateDialog, ottengo uno StackOverflowError ..StackOverflowError durante il tentativo di gonfiare un layout personalizzato per un AlertDialog all'interno di un DialogFragment

Ecco il codice fino al punto in cui si torna indietro al onCreateDialog:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle(R.string.enter_time); 

    LinearLayout outerLayout = (LinearLayout) getLayoutInflater(savedInstanceState) 
      .inflate(R.layout.time_entry_dialog, null); 
    ... 
} 

Ed ecco l'output LogCat:

02-28 22:30:04.220: E/AndroidRuntime(4250): FATAL EXCEPTION: main 
02-28 22:30:04.220: E/AndroidRuntime(4250): java.lang.StackOverflowError 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.app.Activity.getSystemService(Activity.java:4009) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.view.LayoutInflater.from(LayoutInflater.java:210) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.view.ContextThemeWrapper.getSystemService(ContextThemeWrapper.java:75) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:812) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:374) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:18) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:21) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:21) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295) 
...etc 

EDIT: ho trovato questa linea nella fonte di DialogFragment.getLayoutInflater():

mDialog = onCreateDialog(savedInstanceState); 

Quindi .. se non riesco a ottenere un LayoutInflator all'interno di onCreateDialog senza causare una ricorsione infinita, come faccio a gonfiare una vista per un AlertDialog personalizzato?

+0

Cosa avete nel 'time_entry_dialog'? Inoltre, non aver paura di pubblicare lo stacktrace con l'eccezione. – Luksprog

+0

Aggiungere l'uscita Logcat –

+0

Ho aggiunto l'output LogCat. @Luksprog, 'time_entry_dialog' è solo un LinearLayout con gravità centrata –

risposta

12

Se trovato il problema. DialogFragment.getLayoutInflater() contiene una chiamata a onCreateDialog(), quindi chiamare onCreateDialog() dall'interno di getLayoutInflater() crea un ciclo infinito.

Ho trovato la soluzione in questa risposta: https://stackoverflow.com/a/10585164/2020340

io non sono esattamente sicuro se questa è una buona forma, perché in realtà non sembra, ma ho sostituito

getLayoutInflater(savedInstanceState) 

con

getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
+1

Nice! Salvato il mio giorno –

+0

E il mio! Grazie. –

+1

È un bug di Android? Ho avuto anche questo problema, e per me chiamare suCreateDialog da getLayoutInflater non ha senso? – medonja

Problemi correlati