1

50 個までのカスタム コントロール (スイッチ ボタン) を含むダイアログを表示したいと考えています。したがって、これを行う最善の方法は、それらをプログラムでループに追加することです。GroupView要素を1つだけ含むレイアウトでダイログを作成しようとしました:

<?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のすべてのレイアウトのルート)であり、インスタンス化できないため、あなたが話しているインフレ例外の理由になる可能性が最も高いです。、ViewGrouplikeなどのサブクラスの 1 つを使用してください。LinearLayoutRelativeLayout

  • あなたのコードの上に書いた変更を行った後でも、ボットは機能します。まず、ViewGroupクラスにはaddメソッドがありません。おそらくaddViewメソッドの 1 つを参照しています。2 つ目はdlgViewnullその時点でDialogは が表示されていないため、何Viewも見つからないためです。ビューの 1 つに を投稿して、が表示さ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 に答える