Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有标准图标、标题和按钮的独立于平台版本的自定义对话框_Android_Dialog_Customization_Platform Independent - Fatal编程技术网

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。那是……不标准的。:)在这种情况下,请编辑上面的答案。