创建自定义AlertDialog?什么是根视图?

Cod*_*oid 16 android

我想做什么:

创建自定义警报对话框.按钮就像任何警报对话框,但上面是两个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();
Run Code Online (Sandbox Code Playgroud)

文件说:

View layout = inflater.inflate(R.layout.custom_dialog,
                           (ViewGroup) findViewById(R.id.layout_root));
Run Code Online (Sandbox Code Playgroud)

其中第一个参数是布局资源ID,第二个参数是根视图的ID.

问题是我不知道布局根是什么?这是一个我将在一个Activity中启动的对话框.如果活动我应该使用布局ID吗?layout_root是从帽子中拉出来的吗?

还尝试过:

  View layout = inflater.inflate(R.layout.my_custom_layout,
                                   (ViewGroup)   findViewById(android.R.id.content).getRootView());
Run Code Online (Sandbox Code Playgroud)

结果空指针.

Cze*_*ogy 36

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

预期的布局通胀:

如果您在Android应用程序中使用LayoutInflater编写了类似下面的代码:

inflater.inflate(R.layout.my_layout, null);
Run Code Online (Sandbox Code Playgroud)

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

...... ......

每条规则都有例外

当然,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();
Run Code Online (Sandbox Code Playgroud)

这里的问题是AlertDialog.Builder支持自定义视图,但不提供采用布局资源的setView()实现; 所以你必须手动充气XML.但是,因为结果将进入不公开其根视图的对话框(实际上它还不存在),我们无法访问布局的最终​​父级,因此我们不能将其用于通货膨胀.事实证明,这是无关紧要的,因为AlertDialog无论如何都会擦除布局上的任何LayoutParams并用match_parent替换它们.

本文解释了为什么在大多数其他情况下应该提供父级ViewGroup而不是Dialog构建.


Mic*_*elP 1

你试过这个吗?

View layout = inflater.inflate(R.layout.custom_dialog,null);
Run Code Online (Sandbox Code Playgroud)