主题不适用于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; }