我正在将旧的对话框切换到DialogFragment,但主题和样式似乎不起作用。
我正在使用兼容性库 v4 中的 DialogFragment,在 onCreate 方法中,我尝试调用 setStyle(style, theme); 有很多不同的主题,但对话框在运行 Android 4.0.3 的模拟器中始终显示为"旧"对话框(即,它不显示在 Holo 主题中)。
还有什么我应该做的吗?使用兼容性库是否会禁用 Holo 主题或其他任何内容?如果是这种情况,我是否应该创建两个对话片段,一个用于旧版本,一个用于较新版本?
谢谢!
这是我的对话框的(简化)代码。我已经尝试了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();
}
您不必将 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);
您需要在实际对话框而不是片段上设置主题
使用此构造函数创建警报对话框:
AlertDialog.Builder(Context context, int theme)
即
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme)
我只是浪费了很多时间,但我终于找到了一种完全用 xml 完成此操作的方法。
在应用程序主题中,对话框实际上是单独主题的。 因此,要使用绿色按钮和绿色编辑文本提示设置所有对话片段的样式,您可以创建如下样式:
<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>
然后将此主题作为对话框主题添加到应用程序主题中
<style name="MyTheme" parent="android:Theme.Holo.Light">
<item name="android:dialogTheme">@style/DialogTheme</item>
</style>
非常感谢写这篇文章的人向我展示了我一直在寻找的东西的路径!
这是一个更新的答案,使用 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");
}
你应该在"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;
}