动态设置 DialogFragment 样式

Style DialogFragment Dynamically

我目前动态设置 AlertDialog 标题部分的样式。但是,我只能在显示对话框后执行此操作。我想将我所有的对话框移动到它们自己的 class 并扩展 DialogFragment,如 Google shows here.

所以目前在创建 AlertDialog 我会做这样的事情:

AlertDialog dialog = builder.create();
dialog.show();
colorAlertDialogTitle(dialog);

public static void colorAlertDialogTitle(AlertDialog dialog, ThemeColors colors) {
    int color = myColor;
    int background = myBackgroundColor;

    int dividerId = dialog.getContext().getResources().getIdentifier("titleDivider", "id", "android");
    ImageView divider = (ImageView) dialog.findViewById(dividerId);
    if (divider != null) {
        divider.setBackgroundColor(color);
    }

所以现在,当我将我的代码移动到扩展 DialogFragment 的 class 时,我尝试在显示对话框之前在 class 中设置对话框的样式,应用程序崩溃并出现此错误:

android.util.AndroidRuntimeException: requestFeature() must be called before adding content
    at com.android.internal.policy.PhoneWindow.requestFeature(PhoneWindow.java:317)
    at com.android.internal.app.AlertController.installContent(AlertController.java:231)
    at android.app.AlertDialog.onCreate(AlertDialog.java:423)
    at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
    at android.app.Dialog.show(Dialog.java:295)
    at android.app.DialogFragment.onStart(DialogFragment.java:499)
    at android.app.Fragment.performStart(Fragment.java:2244)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1002)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
    at android.app.BackStackRecord.run(BackStackRecord.java:793)
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
    at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

所以我不知道如何使用正确的方式创建对话框并且仍然能够动态设置它们的样式。

一旦我将它移动到 DialogFragment,我就会做这样的事情:

public class ProspectDialog extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            LayoutInflater inflater = getActivity().getLayoutInflater();

            View mView = inflater.inflate(R.layout.myLayout, null);
            builder.setView(mView);

            builder.setTitle(R.string.title);
            builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            AlertDialog dialog = builder.create();
            colorAlertDialogTitle(dialog);
            return dialog;
        }

    }

显示 AlertDialog 后,您只能访问 UI 个元素(分隔线)。被创造是不够的。

你可以在你的Fragment

中引入一个变量
private AlertDialog mDialog;

你在onCreateDialog()

中设置的
mDialog = builder.create();

然后你可以使用这样的颜色更改方法:

myDialogFragment.show(getSupportFragmentManager(), "coloredDialog");
myDialogFragment.colorAlertDialogTitle(myDialogFragment.getDialog());

(其中 getDialog() 是通常的 getter 方法)

请查看此 post 的 "If you want to customize the AlertDialog a lot. For example adding some checkboxes with custom background color, use this approach:" 部分。在此 post 中,我展示了如何动态更改 AlertDialog 的样式。希望对你有帮助。