Android 具有标准图标、标题和按钮的独立于平台版本的自定义对话框
我试图存档的内容:我想要一个带有自定义视图的对话框,但我想要Android 具有标准图标、标题和按钮的独立于平台版本的自定义对话框,android,dialog,customization,platform-independent,Android,Dialog,Customization,Platform Independent,我试图存档的内容:我想要一个带有自定义视图的对话框,但我想要AlertDialog中的标准图标、标题和按钮 我正在做的是这个自定义对话框类: public class CustomDialog extends AlertDialog.Builder { private Activity activity; private View root; public CustomDialog(Activity context) { super(context);
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;
}
}
这工作得很好,除了在pre-Honeycomb和Honeycomb设备上的
TextView
颜色不正确之外。我使用的是Holo.Light
主题,因此标准文本颜色是黑色,但在蜂窝式设备之前,对话框的背景颜色也是黑色。在蜂窝设备上,对话框背景为白色。所以我所做的是,我在values
文件夹的style.xml
中添加了一个dialogTextColor=white
,在values-v11
文件夹中添加了dialogTextColor=black
。然后,我必须将style属性添加到我在自定义对话框中使用的每个TextView
。这在ICS之前一直有效,很清楚为什么->v11。我可以更改它,但我想有一个自定义对话框,它可以做所有正确的事情:基于应用程序主题的pre Honeycom、Honeycom、ICS(以及将来将出现的任何内容)上的文本颜色、对话框的宽度、标准按钮、标题、,警报对话框中的图标
这里的技巧是上下文与主题相关联。这个主题决定了所有的事情,比如默认的文本颜色等等
在蜂巢之前,对话框总是有相同的主题,无论它们是由明暗主题的活动生成的,除了列表,对话框是暗背景、亮前景。在“蜂巢”和“前进”中,对话框具有不同的主题,这些主题由生成对话框的活动决定
在弹出对话框中的内容时,始终使用对话框#getContext()
方法返回的上下文,而不是生成对话框的活动。请尝试以下操作,而不是使用上面的代码行来获取LayoutInflater
:
LayoutInflater inflater = LayoutInflater.from(getContext());
编辑:看起来您使用的是AlertDialog.Builder而不是对话框。AlertDialog.Builder为此在API 11中添加了一个getContext()
方法(Android 3.0,又称蜂巢),但在此之前它并不存在。您可以使用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);
这是有道理的。我要尝试一下这个GetContext导致了一个NoSuchMethodError,我和up所做的是activity.getApplicationContext(),它就像你说的那样工作。非常感谢:)我刚刚注意到一个问题。包含文本视图(如单选按钮、时间选择器等)的小部件在蜂巢上是白色的,在蜂巢前的ICS(不可见)和黑色(可见)不使用
getApplicationContext()
作为UI。当涉及主题时,它几乎永远不会做你想做的事情。你能提供更多关于你描述的NoSuchMethodError的信息吗<代码>对话框#getContext()和LayoutInflater#from()
从API 1开始就存在。哦,您正在扩展AlertDialog.Builder。那是……不标准的。:)在这种情况下,请编辑上面的答案。