46

我正在将旧 Dialogs 切换为 DialogFragment,但主题和样式似乎不起作用。

我正在使用兼容性库 v4 中的 DialogFragment,并且在 onCreate 方法中我尝试调用 setStyle(style, theme); 有很多不同的主题,但对话框总是在运行 Android 4.0.3 的模拟器中显示为“旧”对话框(即,它不显示在 Holo 主题中)。

还有什么我应该做的吗?使用兼容性库是否会禁用 Holo 主题或任何东西?如果是这种情况,我是否应该创建两个 DialogFragment,一个用于旧版本,一个用于新版本?

谢谢!


这是我的对话框的(简化)代码。我已经尝试过 Theme_Holo_Dialog_NoActionBar 和 Theme_DeviceDefault_Dialog_NoActionBar,但 Android 4 模拟器总是将对话框显示为“旧”对话框,而不是使用 Holo 主题。我究竟做错了什么?:(

[...]
import android.support.v4.app.DialogFragment;
[...]

public class AlertDialogFragment extends DialogFragment {

  public static AlertDialogFragment newInstance(int id) {

    AlertDialogFragment f = new AlertDialogFragment();
    Bundle args = new Bundle();
    args.putInt("id", id);
    f.setArguments(args);

 }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int style = DialogFragment.STYLE_NORMAL, theme = 0;
    theme = android.R.style.Theme_Holo_Dialog_NoActionBar;
    setStyle(style, theme);     
  }

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    mId = getArguments().getInt("id");
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
        .setTitle(mTitle)
        .setMessage(mMessage)
        .setPositiveButton(getString(R.string.btn_ok), new DialogInterface.OnClickListener() {      
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dismiss();                  
            }
        });
        return builder.create();
    }
4

5 回答 5

49

您不应将 AlertDialog.Builder(Context, int) 构造函数与支持库一起使用,因为它仅从 API 11 开始可用。

要为对话框设置主题,请改用 ContextThemeWrapper,如下所示:

ContextThemeWrapper context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Dialog_NoActionBar);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
于 2012-12-13T14:58:42.987 回答
31

我相信您需要在实际 Dialog 而不是 Fragment 上设置主题

使用此构造函数创建您的 AlertDialog:

 AlertDialog.Builder(Context context, int theme)

IE

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme)
于 2012-05-18T13:55:44.533 回答
22

我只是为此浪费了很多时间,但我终于找到了一种完全在 xml 中执行此操作的方法。

在应用程序主题中,对话框实际上是单独主题的。因此,要使用绿色按钮和绿色 EditText 提示设置所有 DialogFragments 的样式,您可以创建如下样式:

<style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog">
    <item name="android:buttonStyle">@style/button_green</item>
    <item name="android:textColorHint">@color/green</item>
</style>

然后将此主题作为 dialogTheme 添加到您的应用程序主题中

<style name="MyTheme" parent="android:Theme.Holo.Light">
    <item name="android:dialogTheme">@style/DialogTheme</item>
</style>

非常感谢写这篇文章的人向我展示了我一直在寻找的道路!

于 2014-06-23T22:27:46.930 回答
2

这是一个更新的答案,使用 23 的目标 SDK 和 14 的最小 SDK,此代码非常适合我。

问题中代码的主要变化是在构造函数中设置主题,仅覆盖onCreateDialog(),并使用 v7 支持库中的 AlertDialog 类。

使用此代码,绿色文本扁平(无边框)按钮显示在 4.4.4 上,而不是带边框的默认灰色按钮。

import android.support.v7.app.AlertDialog;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

public class MyDialog extends DialogFragment {

    String message;

    public MyDialog(String m) {
        message = m;
        int style = DialogFragment.STYLE_NORMAL, theme = 0;
        theme = android.R.style.Theme_Holo_Dialog_NoActionBar;
        setStyle(style, theme);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return new AlertDialog.Builder(getActivity())
                .setMessage(message)
                .setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((EnterPhoneNumberActivity)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton("EDIT",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((EnterPhoneNumberActivity)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
}

AppCompatActivity 中的用法:

    String message = "test";
    if (message != null) {
        DialogFragment newFragment = new MyDialog(message);
        newFragment.show(getSupportFragmentManager(), "dialog");
    }
于 2015-09-17T19:18:55.077 回答
-4

您应该在“onCreateView”中编写这些代码。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    View view = inflater.inflate(R.layout.dialog_your_theme, container);
    return view;
}
于 2013-12-20T06:45:38.697 回答