Sto cercando di creare un DialogFragment
utilizzando una vista personalizzata in un AlertDialog
. Questa visualizzazione deve essere gonfiata da xml. Nella mia classe DialogFragment
ho:Problema di visualizzazione personalizzata per AlertDialog in DialogFragment
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle("Title")
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, null))
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, null)
.create();
}
Ho provato altri metodi di inflazione per .setView()
quali:
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getView(), false))
e
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getTargetFragment().getView(), false))
Dopo aver impostato il frammento di destinazione nel frammento che è mostrando questa finestra di dialogo.
Tutti questi tentativi di gonfiare il mio risultato visualizzazione personalizzata nel seguente eccezione:
E/AndroidRuntime(32352): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
E/AndroidRuntime(32352): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:214)
E/AndroidRuntime(32352): at com.android.internal.app.AlertController.installContent(AlertController.java:248)
E/AndroidRuntime(32352): at android.app.AlertDialog.onCreate(AlertDialog.java:314)
E/AndroidRuntime(32352): at android.app.Dialog.dispatchOnCreate(Dialog.java:335)
E/AndroidRuntime(32352): at android.app.Dialog.show(Dialog.java:248)
E/AndroidRuntime(32352): at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:339)
E/AndroidRuntime(32352): at android.support.v4.app.Fragment.performStart(Fragment.java:1288)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:873)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041)
E/AndroidRuntime(32352): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:625)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1360)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:411)
E/AndroidRuntime(32352): at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(32352): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(32352): at android.os.Looper.loop(Looper.java:132)
E/AndroidRuntime(32352): at android.app.ActivityThread.main(ActivityThread.java:4028)
E/AndroidRuntime(32352): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(32352): at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime(32352): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
E/AndroidRuntime(32352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
E/AndroidRuntime(32352): at dalvik.system.NativeStart.main(Native Method)
Mentre se si tenta di utilizzare s' getLayoutInflator(Bundle)
in questo modo il DialogFragment
:
.setView(getLayoutInflater(savedInstanceState).inflate(R.layout.dialog, null))
ho un StackOverflowError
.
Qualcuno sa come gonfiare una vista personalizzata per un AlertDialog
in un DialogFragment
?
, ma questo mi ha funzionato, ma mi piacerebbe capire perché. Perché getLayoutInflater di dialogFragment restituisce un layout diverso in base a quello dell'Attività? – stork
Ogni LayoutInflater è legato a un contesto (che differisce tra l'attività e il frammento) ei frammenti complicano le cose. Inoltre, ci sono alcune cose che non funzionano in modo ricorsivo (ad esempio, una finestra di dialogo all'interno di una finestra di dialogo). Direi che il problema si trova a metà tra l'ordine di istanziazione e la ricorsione, ma potrebbe essere più semplice semplicemente rotolare con esso piuttosto che scavare ulteriormente ... – ProjectJourneyman
Questo mi ha portato al vero problema che era che devi chiamare 'setView()' prima di ogni altra cosa (come 'setTitle()', che è quello che stavo facendo male). Grazie. – ashughes