主题不适用于Android上的DialogFragment

我将我的旧对话框切换到DialogFragment,但主题和样式似乎没有工作。

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

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

谢谢!


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

[...] 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(); } 

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

使用这个构造函数来创build你的AlertDialog:

  AlertDialog.Builder(Context context, int theme) 

  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme) 

您不应该使用支持库的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); 

我只是失去了很多时间,但是我终于find了一个完全用xml来完成的方法。

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

 <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> 

非常感谢谁写了这个post向我展示了我一直在寻找的path!

这里是一个比较现在的答案,使用目标SDK的14和14的SDK,这个代码完美的工作。

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

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

 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"); } 

您应该在“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; }