Ho capito che questa domanda è stata posta molte volte qui, ma dopo aver trascorso le ultime 1,5 ore di lettura e cercando di risolvere il problema, non posso.AndroidRuntimeException: requestFeature() deve essere chiamato prima di aggiungere contenuto in DialogFragment
dichiarazione del problema:
Quando si chiama il metodo setStyle
in DialogFragment
ottengo l'errore RuntimeException indicato nel titolo.
Questo è il mio codice originale, che non genera questa eccezione:
public class MapDialogFragment extends DialogFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Holo);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.maps_dialog, container, false);
return view;
}
}
ImmersiveMode Ora, ho appena aggiunto per tutta la mia domanda. Come alcuni di voi potrebbero sapere, la modalità immersiva viene persa quando si visualizzano le finestre di dialogo, quindi è necessario scavalcare questi frammenti e impostare i flag appropriati in modo che la modalità venga mantenuta. Ho realizzato con successo questo - funziona. Ma, devo commentare la riga: setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Holo);
, quindi sto perdendo lo stile del mio dialogo e questo è il problema.
Avere uno sguardo più da vicino il metodo setStyle
nel DialogFragment, non posso davvero vedere come requestFeature()
sia invocata:
public void setStyle(int style, int theme) {
mStyle = style;
if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
mTheme = com.android.internal.R.style.Theme_DeviceDefault_Dialog_NoFrame;
}
if (theme != 0) {
mTheme = theme;
}
}
Infine, questa è la mia classe DialogFragment in cui l'eccezione sta accadendo. Si noti la getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
e anche il clearFlag, che erano necessarie per avere l'ImmersiveMode di lavoro (spero che questo sarà utile per qualcuno):
public class MapDialogFragmentv2 extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
//I have also tried the code here, before the super.OnCreate but to no avail
//setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Holo);
super.onCreate(savedInstanceState);
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
MyDialog mDialog = new MyDialog(getActivity());
mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
view = getActivity().getLayoutInflater().inflate(R.layout.maps_dialog, null);
//Line below throws exception. Needs to be commented out
setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Holo);
mDialog.setContentView(view);
return mDialog;
}
public class MyDialog extends Dialog {
public MyDialog(Context context) {
super(context);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
getWindow().getDecorView().setSystemUiVisibility(MainActivity.getImmersiveModeFlags());
}
@Override
public void show() {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
super.show();
}
}
}
Inoltre ho provato utilizzando un mix di onCreate
, onCreateView
e onCreateDialog
ma didn' lavoro. Ho anche letto qui su Stackoverflow qualcuno che ha commentato che non era una buona idea avere onCreateView e onCreateDialog allo stesso tempo.
E anche provato ad aggiungere lo stile al mio layout xml per sé, ma anche non ha funzionato:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/lib/com.google.android.gms.plus"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
style="@android:style/Theme.Holo.Dialog" >
Grazie
Hai provato a chiamare setStyle() all'interno onCreate(), ma piuttosto dopo super.onCreate (savedInstanceState)? –
@ dev.bmax sì, l'ho fatto. In effetti, quello era il codice molto originale. –
La tua 'MapDialogFragmentv2' è una classe annidata all'interno di un' Activity'? –