android – 具有标准图标,标题和按钮的平台版本独立自定义对话框

我想要存档的内容:我想要一个带有自定义视图的对话框,但我想要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设备上,对话框背景为白色.所以我做的是,我在values文件夹的styles.xml中添加了dialogTextColor = white,在values-v11文件夹中添加了dialogTextColor = black.然后我必须将style属性添加到我在自定义对话框中使用的每个TextView.这个问题一直持续到ICS,而且很清楚为什么 – > V11.我可以改变它,但是我希望有一个自定义对话框,它可以完成所有操作:基于应用程序主题,对话框的宽度,预蜂窝,Honeycomb,ICS(以及将来会出现的任何内容)的文本颜色, AlertDialog中的标准按钮,标题,图标.

解决方法:

这里的诀窍是Context与主题相关联.该主题决定了各种事物,如文本颜色等.

在Honeycomb Dialogs之前总是有相同的主题,无论它们是从浅色或深色主题活动生成的,除了列表对话框是深色背景,浅色前景.在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);

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...