1

我想显示一个带有约 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)。我究竟做错了什么?

4

1 回答 1

1

您的代码中的问题非常明显:

  • 在您的布局文件中,您使用ViewGroup的是一个抽象类(Android 中所有布局的根)并且无法实例化,因此它很可能是您所说的膨胀异常的原因。使用ViewGroup, likeLinearLayout等的子类之一RelativeLayout,哪个更适合您。

  • 即使在完成我上面写的修改之后,您的代码仍然可以使用机器人。首先,ViewGroup该类没有add方法,您可能指的是其中一种addView方法。其次dlgViewnull因为那一刻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
于 2012-11-16T20:10:56.587 回答