在Android中的MultiChoice AlertDialog中切换复选框

时间:2010-08-31 10:10:53

标签: android

  

您好,

     

我创建了 MultiChoice   AlertDialog AlertDialog有五个   列出带有复选框的项目。当我   选中第一个复选框,w.r.t这个   如果列表中的其他复选框   检查他们是否不加控制   自动反之亦然。

     

我正在检查 isChecked 状态   在 onClick 方法中    OnMultiChoiceClickListener()并调用    showDialog(DIALOG_MULTIPLE_CHOICE); 更新布尔[]   checkedItems; 重新创建   对话,但我无法实现。   如果您有任何建议请直接   我正确的方式。

有没有办法重新创建单击按钮单击的AleartDialog onClick事件。

下面的一些示例代码:

case DIALOG_MULTIPLE_CHOICE:
final String[] lJobTypes = { "Item1", "Item2", "Item3","Item4", "Item5" };
    return new AlertDialog.Builder(JoblistPage.this)
    // .setIcon(R.drawable.logo)
    .setTitle("Title Here")
    // .setCustomTitle(m_Title)
    .setMultiChoiceItems(lTypes, m_Selections,
        new DialogInterface.OnMultiChoiceClickListener() {

            public void onClick(DialogInterface dialog,int whichButton, boolean isChecked) {
                /* User clicked on a check box do some stuff */
                if (isChecked) {
                    m_CheckCount++;
                    //Toggle the Radio button Check status
                } else {
                    m_CheckCount--;
                }
                                                }
        }).setPositiveButton("Ok",
        new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog,
                    int whichButton) {
                    }
                }).create();

此致 维纳亚克

3 个答案:

答案 0 :(得分:21)

不要重新创建对话框,只需在当前对话框中切换复选框即可。您的onMultiChoiceClickListener可以跟踪当前活动的复选框(如果有),并在选择其他复选框时取消选中它。这是一个经过完整测试的工作示例:

package com.stackoverflow.beekeeper;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;

public class StackOverflowTest extends Activity {
  /** Called when the activity is first created. */
  @Override public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  private int mSelected = -1;

  @Override protected void onResume() {
    super.onResume();
    final Builder build = new Builder(this);
    build.setTitle("List selection");
    build.setCancelable(true);
    final String[] strings = new String[]{"Cow", "Horse", "Goat"};
    final OnMultiChoiceClickListener onClick =
      new OnMultiChoiceClickListener() {
        @Override public void onClick(final DialogInterface dialog,
                                      final int which, final boolean isChecked) {

          if (isChecked) {
            if ((mSelected != -1) && (mSelected != which)) {
              final int oldVal = mSelected;
              final AlertDialog alert = (AlertDialog)dialog;
              final ListView list = alert.getListView();
              list.setItemChecked(oldVal, false);
            }
            mSelected = which;
          } else
            mSelected = -1;
        }
      };
    build.setMultiChoiceItems(strings, null, onClick);
    build.setPositiveButton("Done", new OnClickListener() {
      @Override public void onClick(final DialogInterface dialog,
                                    final int which) {
        String message = null;
        if (mSelected == -1)
          message = "You didn't select anything.";
        else
          message = "You selected '" + strings[mSelected] + "'";
        Toast.makeText(StackOverflowTest.this, message, Toast.LENGTH_LONG).show();
      }
    });
    build.show();
  }
}

需要注意的一点是:必须在“setMultiChoiceItems”调用中为“checkedItems”参数指定“null” - 否则“setItemChecked”调用将无法按预期工作。最终会使用该数组存储已检查的状态,而“setItemChecked”将无法正确更新它,因此一切都会混淆。奇怪,但确实如此。

答案 1 :(得分:6)

我一直在努力解决这个问题。我维护每个项目的“已检查”状态数组,并在视觉上更改setItemChecked值时更改该值。然后当单击完成按钮时,我遍历“checked”以将值保存到我的db。

builder.setMultiChoiceItems(cats, checked, new DialogInterface.OnMultiChoiceClickListener() {
        public void onClick(DialogInterface dialog, int item, boolean check) {
            if(cats[item].equals("All Categories")) {
                AlertDialog d = (AlertDialog) dialog;
                ListView v = d.getListView();
                int i = 0;
                while(i < cats.length) {
                    v.setItemChecked(i, check);
                    checked[i] = check;
                    i++;
                }
            }
            checked[item] = check;
        }
    });

答案 2 :(得分:2)

您是否尝试在对话框中将setMultiChoiceItems替换为setSingleChoiceItems