Android 创建自定义警报对话框?什么是根视图?

Android 创建自定义警报对话框?什么是根视图?,android,Android,我想做的是: 创建自定义警报对话框。按钮与任何警报对话框一样,但上面是两个文本编辑输入框。我不想创建自定义对话框,但想创建自定义警报对话框 以下是我正在尝试的#3: 它说: AlertDialog.Builder builder; AlertDialog alertDialog; Context mContext = getApplicationContext(); LayoutInflater inflater = (LayoutInflater) mContext.getSystemSe

我想做的是:

创建自定义警报对话框。按钮与任何警报对话框一样,但上面是两个文本编辑输入框。我不想创建自定义对话框,但想创建自定义警报对话框

以下是我正在尝试的#3:

它说:

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
                           (ViewGroup) findViewById(R.id.layout_root));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");


builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();
文件说:

View layout = inflater.inflate(R.layout.custom_dialog,
                           (ViewGroup) findViewById(R.id.layout_root));
其中,第一个参数是布局资源ID,第二个参数是根视图的ID

问题是我不知道布局根是什么?这是一个对话,我将在活动中使用它。如果是活动,我应该使用布局id吗?你的根是从帽子里拔出来的吗

还尝试:

  View layout = inflater.inflate(R.layout.my_custom_layout,
                                   (ViewGroup)   findViewById(android.R.id.content).getRootView());
结果空指针。

您尝试过这个吗

View layout = inflater.inflate(R.layout.custom_dialog,null);

嗯。文档中的根视图引用自定义布局中的元素。因此,自定义布局将有一个称为根视图的最外层视图。您需要为其提供一个Id,然后才能将其传入,如图所示。因此,第一个参数是自定义视图id,第二个参数是自定义视图中根布局元素的id

 View layout = inflater.inflate(R.layout.custom_dialog,
                       (ViewGroup) findViewById(R.id.layout_root));

因此,在上述文档中给出的示例中,R.id.layout\u root指的是您提供的id,例如自定义对话框布局中最外层的线性布局。

即使是较旧的问题,本文也可能对其他搜索此答案的人有用:

:

如果您曾经使用 Android应用程序中的LayoutFlater:

inflater.inflate(R.layout.my_layout, null);
请继续读下去,因为你做错了,我想向你解释 你知道为什么

但是

每一条规则都有例外 当然,在某些情况下,您可以真正证明
null
在通货膨胀期间,他们是父母,但他们很少。出现了这样一个例子 将要附着到的自定义布局展开时
警报对话框
。考虑下面的示例,在这里我们要使用 相同的XML布局,但将其设置为对话框视图:

AlertDialog.Builder builder = new AlertDialog.Builder(context);
View content = LayoutInflater.from(context).inflate(R.layout.item_row, null);

builder.setTitle("My Dialog");
builder.setView(content);
builder.setPositiveButton("OK", null);
builder.show();
这里的问题是AlertDialog.Builder支持自定义视图,但是 不提供采用布局的setView()的实现 资源;因此,您必须手动膨胀XML。但是因为 结果将进入对话框,该对话框不显示其根视图 (事实上,它还不存在),我们无法访问最终的 布局的父级,因此我们不能将其用于膨胀。原来,, 这与此无关,因为AlertDialog将删除上的任何LayoutParams 布局仍然存在,并将其替换为match_parent

这篇文章解释了为什么在对话框构建以外的大多数情况下都应该提供父视图组

builder.setView(layout);
layout.getRootView();

应该给出
线性布局

这个答案太完美了!但是现在使用支持库,您可以使用设置资源ID;然后,如果您想以编程方式向任何视图添加一些行为,您只需AlertDialog.findViewById(id)。为此,您应该调用Builder.setView(res)=>Builder.show()=>find(id)。。。问候<代码>视图v=充气机。充气(R.layout.activity_main,空)生成警告。使用
View.inflate(…,null,false)
只会隐藏警告,但不能解决问题。正确的方法是使用
builder.setView(R.layout.edit\u account\u对话框);dialog=builder.create()但是
findViewById
只有在活动调用了
dialog.show()之后才可用;它带来了另一个问题:对话框的
findViewById
show()
之前不可用,在
show()
之后也不容易调用。顺便说一句,在
dialog.show()之后的活动中调用
findViewById
不是一个好的做法。