Android 以编程方式将控件添加到自定义对话框
我想显示一个对话框,上面有50个自定义控件(开关按钮)。因此,最好的方法是以编程方式将它们添加到循环中。我尝试制作一个只有一个GroupView元素的布局dilog:Android 以编程方式将控件添加到自定义对话框,android,android-dialog,Android,Android Dialog,我想显示一个对话框,上面有50个自定义控件(开关按钮)。因此,最好的方法是以编程方式将它们添加到循环中。我尝试制作一个只有一个GroupView元素的布局dilog: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:layout_height="match_parent" android:layout_width="match_parent" android:orientation
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="#AAAAAA"
xmlns:android="http://schemas.android.com/apk/res/android">
<ViewGroup
android:layout_height="500dp"
android:layout_width="500dp"
android:id="@+id/dlg_view"/>
</LinearLayout>
但它不是这样工作的(它引发了膨胀异常)。我做错了什么?代码中的问题非常明显:
- 在布局文件中,您使用的是
,它是一个抽象类(Android中所有布局的根),无法实例化,因此很可能就是您所说的膨胀异常的原因。使用ViewGroup
的子类之一,如ViewGroup
,LinearLayout
等,哪一个更适合您RelativeLayout
- 即使在做了我上面写的修改之后,您的代码仍然可以正常工作。首先,
类没有ViewGroup
方法,您可能指的是add
方法之一。其次,addView
将为dlgView
,因为此时未显示null
,因此没有要查找的对话框
视图。您可以通过在其中一个视图上发布
来延迟设置视图,直到显示Runnable
:对话框
final Dialog res = builder.create(); oneOfYourViews.post(new Runnable() { @Override public void run() { ViewGroup dlgView = (ViewGroup) res.findViewById(R.id.dlg_view); MyControl myControl = new MyControl(context); dlgView.addView(myControl); } });
View contentView = inflater.inflate(R.layout.geomap_menu, null)
ViewGroup dlgView = (ViewGroup) contentView.findViewById(R.id.dlg_view);
MyControl myControl = new MyControl(this);
dlgView.addView(myControl); // or add the other views in the loop as many as you want
builder.setView(contentView);
// rest of your code
代码中的问题非常明显:
- 在布局文件中,您使用的是
,它是一个抽象类(Android中所有布局的根),无法实例化,因此很可能就是您所说的膨胀异常的原因。使用ViewGroup
的子类之一,如ViewGroup
,LinearLayout
等,哪一个更适合您RelativeLayout
- 即使在做了我上面写的修改之后,您的代码仍然可以正常工作。首先,
类没有ViewGroup
方法,您可能指的是add
方法之一。其次,addView
将为dlgView
,因为此时未显示null
,因此没有要查找的对话框
视图。您可以通过在其中一个视图上发布
来延迟设置视图,直到显示Runnable
:对话框
final Dialog res = builder.create(); oneOfYourViews.post(new Runnable() { @Override public void run() { ViewGroup dlgView = (ViewGroup) res.findViewById(R.id.dlg_view); MyControl myControl = new MyControl(context); dlgView.addView(myControl); } });
View contentView = inflater.inflate(R.layout.geomap_menu, null)
ViewGroup dlgView = (ViewGroup) contentView.findViewById(R.id.dlg_view);
MyControl myControl = new MyControl(this);
dlgView.addView(myControl); // or add the other views in the loop as many as you want
builder.setView(contentView);
// rest of your code
您是否尝试过使用
LayoutInflater
请提供更多详细信息。更多的代码,你充气。。。有关MyController的代码和详细的错误日志输出。最好是标记错误发生的行。代码已更新。。。错误发生在…移动行xmlns:android=”http://schemas.android.com/apk/res/android“
在任何其他行之前使用android:something
在xml布局中声明LinearLayout
,比如@Luksprog有什么区别?无论如何,这没有帮助。您是否尝试过使用LayoutInflater
请提供更多详细信息。更多的代码,你充气。。。有关MyController的代码和详细的错误日志输出。最好是标记错误发生的行。代码已更新。。。错误发生在…移动行xmlns:android=”http://schemas.android.com/apk/res/android“
在任何其他行之前使用android:something
在xml布局中声明LinearLayout
,比如@Luksprog有什么区别?不管怎么说,这没有帮助。这是一种伪代码,我的问题不是代码中的错误,而是“如何以编程方式将控件添加到自定义对话框”。所以,我相信只有一种正确的方法可以做到这一点。@Tutankhamen我不明白你为什么发布伪代码,然后问你为什么会得到那个异常。将小部件添加到对话框中没有问题(也没有单一正确的方法),正确的方法取决于您希望添加哪些小部件、如何添加这些小部件以及从何处添加这些小部件。关于您的代码,不要直接将视图设置为对话框,展开布局,在循环中添加视图,然后将其设置为对话框。我只是说我已经尝试过这种方法,但它不起作用,因此,可能有人知道如何使其正确。这不是很明显吗?谢谢!这正是我想要的!这是一种伪代码,我的问题不是代码中的错误,而是“如何通过编程向自定义对话框添加控件”。所以,我相信只有一种正确的方法可以做到这一点。@Tutankhamen我不明白你为什么发布伪代码,然后问你为什么会得到那个异常。将小部件添加到对话框中没有问题(也没有单一正确的方法),正确的方法取决于您希望添加哪些小部件、如何添加这些小部件以及从何处添加这些小部件。关于您的代码,不要直接将视图设置为对话框,展开布局,在循环中添加视图,然后将其设置为对话框。我只是说我已经尝试过这种方法,但它不起作用,因此,可能有人知道如何使其正确。这不是很明显吗?谢谢!这正是我想要的!