Tôi hiểu câu hỏi này đã được hỏi nhiều lần ở đây nhưng sau khi dành 1,5 giờ đọc và cố gắng phân loại vấn đề của tôi, tôi không thể.AndroidRuntimeException: requestFeature() phải được gọi trước khi thêm nội dung vào DialogFragment
tuyên bố Vấn đề:
Khi gọi setStyle
phương pháp trong DialogFragment
tôi nhận được lỗi RuntimeException ghi trong tiêu đề.
Đây là mã ban đầu của tôi, mà không ném ngoại lệ này:
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;
}
}
Bây giờ, tôi đã chỉ cần thêm ImmersiveMode suốt ứng dụng của tôi. Như một số bạn có thể biết, chế độ chìm sẽ bị mất khi hiển thị Hộp thoại, vì vậy người ta phải ghi đè các đoạn này và đặt cờ thích hợp để chế độ được giữ. Tôi đã thực hiện thành công điều này - nó hoạt động. Nhưng, tôi phải bình luận ra dòng: setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Holo);
, vì vậy tôi đang mất phong cách của hộp thoại của tôi và đây là vấn đề.
Có một cái nhìn sâu hơn về các phương pháp setStyle
trong DialogFragment, tôi có thể không thực sự xem làm thế nào requestFeature()
đang được viện dẫn:
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;
}
}
Cuối cùng, đây là lớp DialogFragment của tôi, nơi các ngoại lệ đang xảy ra. Lưu ý getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
và cũng là clearFlag, đó là cần thiết để có ImmersiveMode làm việc (hy vọng điều này sẽ có ích cho một ai đó):
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();
}
}
}
Tôi cũng đã cố gắng sử dụng một kết hợp của onCreate
, onCreateView
và onCreateDialog
nhưng nó didn' t làm việc. Tôi cũng đọc ở đây tại Stackoverflow ai đó bình luận rằng nó không phải là một ý tưởng tốt để có onCreateView và onCreateDialog cùng một lúc.
Và cũng đã cố gắng bổ sung thêm phong cách để bố trí xml của tôi chính nó, nhưng cũng không làm việc:
<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" >
Cảm ơn bạn
Bạn đã cố gắng gọi setStyle() bên trong onCreate() mà là sau khi super.onCreate (savedInstanceState)? –
@ dev.bmax có, tôi đã làm. Trong thực tế, đó là mã rất ban đầu. –
'MapDialogFragmentv2' của bạn là một lớp lồng nhau bên trong' Hoạt động'? –