【问题标题】:Toggling check boxes in MultiChoice AlertDialog in android在 android 的 MultiChoice AlertDialog 中切换复选框
【发布时间】:2010-08-31 10:10:53
【问题描述】:

嗨,

我创建了 MultiChoice AlertDialog AlertDialog 有五个 列出带有复选框的项目。当我 检查第一个复选框,w.r.t 这个 如果列表中的其他复选框 被检查他们应该被取消检查 自动,反之亦然。

我正在检查 isChecked 状态 在 onClick 方法中 OnMultiChoiceClickListener() 并调用 showDialog(DIALOG_MULTIPLE_CHOICE); 通过更新 boolean[] checkedItems; 重新创建 对话框,但我无法实现它。 如果您有任何建议,请直接 我走对了。

有什么方法可以重新创建单选按钮单击的 AlartDialog 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();

问候 维纳亚克

【问题讨论】:

  • 您的意思是使用 RadioButton 吗?什么是所有属性?您为什么不发布一些代码以消除一些猜测?
  • 嗨 JackN,我已经用代码更新了问题,这可能会让你更清楚

标签: android


【解决方案1】:

不要重新创建对话框,只需切换当前对话框中的复选框。您的 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”不会正确更新它,所以一切都会变得混乱。奇怪,但真实。

【讨论】:

  • 万岁,非常感谢;有用。由于某种原因,很难用谷歌搜索这个问题的解决方案
【解决方案2】:

我为此苦苦挣扎了一段时间。我维护每个项目的“已检查”状态数组,并更改该值,同时直观地更改 setItemChecked 值。然后,当单击完成按钮时,我会遍历“已检查”以将值保存到我的数据库中。

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;
        }
    });

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 那么就没有切换复选框的问题了......我想要多项选择,因为这个切换功能(list1 checkbos被选中然后List2,list3.list4,list5应该被取消选中,如果有的话2、3、4 或 5 中的选中 list1 复选框 shub 未选中)
    • 还要考虑点击什么按钮位置。检查名为“whichbutton”的参数,它应该为您提供已单击项目的位置
    • 是的,但是如何在该事件中重新创建对话框
    猜你喜欢
    • 2015-07-14
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2021-09-23
    • 2020-08-16
    • 2014-04-16
    相关资源
    最近更新 更多