我想在其上显示一个包含~50个自定义控件(切换按钮)的对话框。因此,最好的方法是以循环方式以编程方式添加它们。我试图用一个包含唯一一个GroupView元素的布局制作一个dilog:
<?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>
然后使用:onCreateDialog(...)方法在其中添加我的控件:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
builder.setView(inflater.inflate(R.layout.geomap_menu, null))
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// sign in the user ...
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//LoginDialogFragment.this.getDialog().cancel();
}
});
Dialog res = builder.create();
ViewGroup dlgView = (ViewGroup)res.findViewById(R.id.dlg_view);
MyControl myControl = new MyControl(this);
dlgView.add(myControl);
但它不会以这种方式工作(它会抛出InflateException)。我做错了什么?
我希望有人能把我踢向正确的方向......
答案 0 :(得分:1)
代码中的问题非常明显:
在您的布局文件中,您使用ViewGroup
这是一个抽象类(Android中所有布局的根)并且无法实例化,因此很可能是导致该膨胀异常的原因你说说。使用ViewGroup
的其中一个子类,例如LinearLayout
,RelativeLayout
等,哪一个更适合您。
即使在我上面写的修改后你的代码仍然可以运行。首先,ViewGroup
类没有add
方法,您可能指的是addView
方法之一。其次dlgView
将为null
,因为此时Dialog
未显示,因此找不到View
。您可以在其中一个观看点上发布Runnable
来延迟设置观看次数,直到显示Dialog
为止:
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