17

我想做的是:

创建自定义警报对话框。按钮就像任何警报对话框一样,但上面是两个 TextEdit 输入框。我不想创建自定义对话框,而是自定义警报对话框

这是我正在尝试的#3:http: //developer.android.com/guide/topics/ui/dialogs.html

它说:

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,第二个参数是根 View 的 ID。

问题是我不知道布局根是什么?这是我将在 Activity 中启动的对话框。如果活动,我应该使用布局ID吗?layout_root 是不是脱胎换骨了?

也试过:

  View layout = inflater.inflate(R.layout.my_custom_layout,
                                   (ViewGroup)   findViewById(android.R.id.content).getRootView());

结果空指针。

4

4 回答 4

38

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

布局膨胀按预期

如果您曾经在 Android 应用程序中使用 LayoutInflater 编写过类似以下代码:

inflater.inflate(R.layout.my_layout, null);

请继续阅读,因为您做错了,我想向您解释原因。

...但是...

每条规则都有例外

当然,在某些情况下,您可以null 在通货膨胀期间真正证明父母是正当的,但它们很少。当您将自定义布局膨胀以附加到 AlertDialog. 考虑以下示例,我们希望使用相同的 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 替换它们。

这篇文章解释了为什么在对话框构建之外的大多数其他情况下应该提供父级。ViewGroup

于 2014-07-13T08:48:01.957 回答
1

你试过这个吗?

View layout = inflater.inflate(R.layout.custom_dialog,null);
于 2012-05-22T03:22:22.747 回答
1

好的。文档中的根视图是指自定义布局中的元素。所以自定义布局将有一个称为根视图的最外层视图。你需要给它一个 Id,然后你可以将它传递进去,如图所示。所以第一个参数是自定义视图 id,第二个参数是自定义视图中根布局元素的 id。

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

因此,在上面文档中给出的这个示例中,R.id.layout_root 指的是您提供的 id,例如 custom_dialog 布局中最外层的 LinearLayout。

于 2012-05-22T04:03:06.317 回答
0
builder.setView(layout);
layout.getRootView();

应该给LinearLayout

于 2020-08-05T16:38:49.623 回答