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

我在做什么:

创build一个自定义的警报对话框。 button就像任何警报对话框,但上面是两个TextEditinput框。 我不想创build一个自定义的对话框,而是一个自定义的警报对话框

这是我正在尝试#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。

问题是我不知道布局根是什么? 这是一个对话框,我打算在一个活动中踢。 我应该使用布局ID如果活动? layout_root是否脱帽?

还试过:

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

结果为空指针。

Solutions Collecting From Web of "创build自定义AlertDialog? 什么是根视图?"

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

预期布局通货膨胀

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

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

请阅读,因为你做错了,我想向你解释为什么。

但是

每个规则都有例外

当然有些情况下你可以在通货膨胀期间真正地certificate一个null父母,但是他们很less。 一个这样的情况发生时,你要膨胀一个自定义布局连接到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。 但是,因为结果会进入对话框,而不会暴露其根视图(实际上它还不存在),所以我们不能访问布局的最终​​父对象,所以我们不能用它来通货膨胀。 事实certificate,这是无关紧要的,因为AlertDialog无论如何都会清除布局上的任何LayoutParams,并用match_parentreplace它们。

这篇文章解释了为什么你应该在大多数情况下提供父ViewGroup而不是Dialog building。

好。 文档中的根视图引用了自定义布局中的元素。 所以自定义布局将有一个称为根视图的最外层视图。 你需要给这个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。

你尝试过吗?

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