我想要存档的内容:我想要一个包含自定义视图的对话框,但我想要AlertDialog
中的标准图标,标题,按钮。
我正在做的是这个自定义对话框类:
public class CustomDialog extends AlertDialog.Builder {
private Activity activity;
private View root;
public CustomDialog(Activity context) {
super(context);
this.activity = context;
}
public void setView(int layoutResID) {
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
root = inflater.inflate(layoutResID, (ViewGroup) activity.findViewById(R.id.dialog_root), false);
ScrollView scroller = new ScrollView(activity);
scroller.addView(root);
setView(scroller);
}
public void setCustomView(View v) {
ScrollView scroller = new ScrollView(activity);
scroller.addView(v);
setView(scroller);
}
public View getRoot() {
return root;
}
@Override
public AlertDialog create() {
AlertDialog dialog = super.create();
dialog.getWindow().getAttributes().width = LayoutParams.MATCH_PARENT;
return dialog;
}
}
这非常好用,预计在Honeycomb和Honeycomb设备上TextView
颜色不正确。我正在使用Holo.Light
主题,因此标准文本颜色为黑色,但也是预蜂窝设备上对话框的背景颜色。在Honeycomb设备上,对话框背景为白色。所以我做的是,我在dialogTextColor=white
文件夹中的styles.xml
和values
文件夹中的dialogTextColor=black
添加了values-v11
。然后我必须将style属性添加到我在自定义对话框中使用的每个TextView
。这个问题一直持续到ICS,而且很清楚为什么 - > V11。我可以改变它,但是我希望有一个自定义对话框,它可以完成所有操作:基于应用程序主题,对话框的宽度,预蜂窝,Honeycomb,ICS(以及将来会出现的任何内容)的文本颜色, AlertDialog
的标准按钮,标题,图标。
答案 0 :(得分:11)
这里的诀窍是Context与主题相关联。该主题决定了各种事物,如默认文本颜色等。
在Honeycomb之前,对话框始终具有相同的主题,无论它们是从浅色或深色主题活动生成的,除列表外,对话框是深色背景,浅色前景。在Honeycomb和forward中,Dialogs具有不同的主题,这些主题由生成它们的Activity确定。
在对话框中膨胀内容时,请始终使用Dialog#getContext()
方法返回的Context而不是生成Dialog的Activity。您可以尝试使用
LayoutInflater
的代码行
LayoutInflater inflater = LayoutInflater.from(getContext());
编辑:看起来你正在使用AlertDialog.Builder而不是Dialog。 AlertDialog.Builder在API 11(Android 3.0,a.k.a。Honeycomb)中为此目的添加了getContext()
方法,但在此之前它不存在。您可以使用ContextThemeWrapper
为旧设备构建自己的主题上下文。只是确保你永远不会尝试在旧版本的平台上调用该方法。您可以通过简单的检查来保护它:
Context themedContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
themedContext = getContext();
} else {
themedContext = new ContextThemeWrapper(activity, android.R.style.Theme_Dialog);
}
LayoutInflater inflater = LayoutInflater.from(themedContext);