【问题标题】:CheckBox[] with onClickListener[]?带有 onClickListener[] 的 CheckBox[]?
【发布时间】:2011-09-07 10:52:22
【问题描述】:

编辑:这个问题基本上已经结束,我对这段代码的唯一问题是here

对于我的应用程序的一部分,我有一个项目页面,表示为复选框,每个项目都有一个关联的布尔值,最终被收集并存储为字符串,如下所示:

final CheckBox gas_oil = (CheckBox) findViewById(R.id.gas_oil);
gas_oil.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
    {
    if (gas_oil.isChecked())
        {
        impacts.append(getString(R.string.gas_oil) + " | ");
        anythingchecked = true;
        }
    }
});

这非常乏味,而且似乎不是一种非常有效的方法,因为我有 9 或 10 项用户可以检查或不检查的项目。此方法还意味着,如果他们单击并取消单击某些内容,则该项目仍位于 StringBuilder impacts 中,并且如果再次单击它,则该项目在那里两次。

我的解决方案是将所有内容都放在数组中:

  String[] impactsn = getResources().getStringArray(R.array.impacts);
  final boolean[] impactsb = new boolean[impactsn.length];
  final CheckBox[] impactsc = new CheckBox[impactsn.length];
  View[] impactsv = new View[]{findViewById(R.id.gas_oil),findViewById(R.id.ghost_fishing),findViewById(R.id.marsh_damage),findViewById(R.id.nav_haz),findViewById(R.id.shell_damage),findViewById(R.id.waste_pollution),findViewById(R.id.wild_entang),findViewById(R.id.other)};

  for (int i = 0; i < impactsn.length; i++)
    {
    impactsc[i] = (CheckBox) impactsv[i];
    impactsc[i].setOnClickListener(new OnClickListener()
            {   
            @Override
            public void onClick(View v)
                {
                if (impactsc[i].isChecked())
                    impactsb[i] = true;
                else
                    impactsb[i] = false;
                }
            });
    }

不幸的是,这样做会导致问题(据我了解)OnClickListener 中的内容必须是最终的。使用编写的代码,i 永远不会是最终的,所以我有点停滞不前。

我应该/我也可以有一个OnClickListeners 的数组吗?我应该调用我这里的代码之外的方法吗?

另外,下面是我计划使用的吸气剂,我认为这部分可以正常工作:

String getImpacts ()
    {
            String[] impactsn = getResources().getStringArray(R.array.impacts);
    StringBuilder impactss = new StringBuilder();
    for (int i = 0; i < impactsn.length; i ++)
        {
        if (impactsb[i])
                    impactss.append(impactsn[i] + " | ");
        }
    return String.valueOf(impactss);
    }

编辑:这是我现在运行的代码版本:

包 com.citsci.mardeb;

导入android.app.Activity; 导入android.content.res.Resources; 导入android.os.Bundle; 导入android.view.View; 导入 android.widget.CheckBox; 导入android.widget.EditText;

公共类 Impacts 扩展 Activity 实现 View.OnClickListener { 整数长度 = 7; boolean[] Impactb = new boolean[] {false, false, false, false, false, false, false, false}; 编辑文本视图;

public void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.impacts);

// for (int i = 0; i

  View[] impactsv = new View[]
     {
    findViewById(R.id.gas_oil),
        findViewById(R.id.ghost_fishing),
        findViewById(R.id.marsh_damage),
        findViewById(R.id.nav_haz),
        findViewById(R.id.shell_damage),
        findViewById(R.id.waste_pollution),
        findViewById(R.id.wild_entang),
        findViewById(R.id.other)
        };

  CheckBox[] impactsc = new CheckBox[length];

  for (int i = 0; i < length; i++)
     {
     impactsc[i] = (CheckBox) impactsv[i];
     impactsc[i].setOnClickListener(this);
     }

}// end of onCreate

@Override
public void onClick(View v)
    {
  switch (v.getId()) {
     case (R.id.gas_oil):
        impactsb[0] =! impactsb[0];
        break;
     case (R.id.ghost_fishing):
        impactsb[1] =! impactsb[1];
        break;
     case (R.id.marsh_damage):
        impactsb[2] =! impactsb[2];
        break;
     case (R.id.nav_haz):
        impactsb[3] =! impactsb[3];
        break;
     case (R.id.shell_damage):
        impactsb[4] =! impactsb[4];
        break;
     case (R.id.waste_pollution):
        impactsb[5] =! impactsb[5];
        break;
     case (R.id.wild_entang):
        impactsb[6] =! impactsb[6];
        break;
     case (R.id.other):
        impactsb[7] =! impactsb[7];
        }
    }

String getImpacts ()
    {
    String[] impactsn = new String[length];
    Resources myResources = getResources();
    impactsn = myResources.getStringArray(R.array.impacts);
  StringBuilder impactss = new StringBuilder();
    for (int i = 0; i < length; i ++)
        {
        if (impactsb[i])
            impactss.append(impactsn[i] + " | ");
        }
    if (String.valueOf(impactss) != "")
        impactss.insert(0, "Impacts: ");
    return String.valueOf(impactss);
    }
}// end of Impacts.class

【问题讨论】:

  • 您应该考虑使用 HashMaps 来存储这样的数据。也许您可以在更高的层次上解释您正在尝试做什么?这对我来说似乎不是正确的实现。
  • 哈哈,你可能完全是对的,我正在编造这一切。简而言之,我的应用程序应该是这种形式dhec form 的一种有趣版本。当用户完成表单后,他们单击提交,应用程序将他们提交的所有信息收集到一个字符串中,以便可以将其附加到电子邮件中并提交。我现在不知道HashMaps 是什么,但我会查看 developer.android.com 并在此处查看是否合适。
  • 抱歉格式草率,我使用制表符,所以使用空格,来回令人沮丧。

标签: android arrays checkbox boolean listener


【解决方案1】:

在这种情况下不要使用匿名(内联)侦听器。而是让您的 Activity 实现侦听器...

public class MyActivity extends Activity
    implements View.OnClickListener {

    ...

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case impactsv[0].getId:
                impactsb[0] = !impactsb[0];
                ...
                break;

            // Add other cases here

        }

    }
}

那么设置监听器所需要做的就是……

impactsc[i].setOnClickListener(this);

然后使用传递给的 View 来测试点击了哪个 CheckBox...

onClick(View v)

【讨论】:

  • 哇...令人兴奋的哈哈,非常感谢。我不想让你用勺子喂我这个但是“然后通过使用传递给...onClick(View v)的视图来测试哪个复选框被点击了”有点令人困惑,这就是你的意思:@Override public void onClick(View v) { for (int i = 0; i &lt; impactsn.length; i++) { if (v == impactsv[i]) impactsb[i] = true; else impactsb[i] = false; } }抱歉这么草率......我无法弄清楚如何正确格式化代码
  • 哼哼……晚饭后。也可能这是我贪婪/不耐烦,但有没有办法让switch (v.getId()) {case findViewById(impactsv[0]): impactsb[0] = true; 工作?同样使用您的解决方案,当用户再次单击某些内容以取消选择它时会发生什么情况,布尔值是 toggle 吗?再次,非常感谢,我会在几个小时后恢复
  • @hooraygradschool:查看我编辑的案例陈述。使用一元“NOT”运算符(!又名逻辑补语运算符)切换布尔值。
  • 正是我实现的,谢谢!下一个问题,如果您还有时间/兴趣,为什么String[] impactsn = getResources().getStringArray(R.array.impacts); 会导致我的应用失败?
  • @hooraygradschool:对不起,我不知道——只要数组存在于正确的位置,看起来就可以。数组中的任何字符串中是否有任何“特殊”字符?撇号和引号需要“转义”,例如,\' 或 \"
【解决方案2】:

首先你不必将它们设为final,你可以在函数之外声明它们,然后你就不会被要求将它们声明为final。 其次,如果您需要在复选框更改时知道它们的状态,您可以为每个复选框添加一个具有不同任务的侦听器,当然,您可以使用循环来完成,然后该循环将调用另一个函数,该函数将有这个 chsckbox 的标签,并且会根据这个标签做出反应。 如果您不需要知道它们更改时的状态,您可以在完成此屏幕后使用 isSelected() 方法检查它们的状态。

希望这会有所帮助, 最好的问候。

【讨论】:

  • 对于上述问题,您可以通过 if(v==checkBoxes[i]) do something 来检查它是哪一个
  • 虽然我确定您可能是对的,但如果没有任何代码示例,很难遵循您的建议,也许您可​​以编辑我提供的代码以匹配您所说的内容?
【解决方案3】:

这里有一个完整的代码,只需填写您的需要:

公共类 mainA 扩展了 Activity { CheckBox[] chbx;按钮应用;

public void OnCreate(Bundle bundle)
{   super.onCreate(bundle);
    setMyChBx();apply=new Button(this);
    apply.setOnClickListener(new View.OnClickListener()
{   public void onClick(View v)
    {   if(chbx[0].isSelected()) setsomthing0();
        if(chbx[1].isSelected()) setsomthing1();
        if(chbx[2].isSelected()) setsomthing2();
        if(chbx[3].isSelected()) setsomthing3(); // and so on
    }
});
}

public void setMyChBx()
{   chbx=new CheckBox[25];
    for(int i=0;i<25;i++)
    {   chbx[i]=new CheckBox(this);
        chbx[i].setTag(new Integer(i));//tags for the checkboxes simply from 0 to 24 (24 included)
        chbx[i].setOnClickListener(new chBxOnclick());
    }

}
/*
 * here you have three options to create one onclick method to all of them or to create many onclicks for each on of them
 * or don't create onclick method for the checkboxes just check the state once it's all done like above
 * example for onclick for all of them
 */

public class chBxOnclick implements OnClickListener
{   public void onClick(View v)
{   switch((Integer)v.getTag())   
    {   case 0: dosomething();break;
        case 1: dothis();break;
        case 2: dathat(); break;
        .
        .
        .
        case 24: doFor24();break;
    }
}

}

}

【讨论】:

  • 顺便说一句,我更喜欢标签方法,因为这样你确定这是正确的复选框,并且不涉及混合,可能发生的事情,也更容易理解你在做什么.
  • hrm 这很有趣,我现在正在看。
  • 我喜欢标签的东西,我实现了它。我只需要它来检查一次所有内容的状态,但是对于您如何使用apply 按钮执行此操作,我有点不清楚。我将编辑我的问题中的代码以反映我目前正在使用的内容。
  • 抱歉回复晚了,有两件事,首先我不喜欢在我的主要活动中实现 onclick 界面,另一方面我假设你没有编写一个只有功能的活动对于onclick接口,这种方式很容易出错,直接创建一个类就可以了,甚至这样:setOnClickListener(new View.onClickListener(){ public void onClick(){ @todo }});
  • 第二个是你的问题,一旦你在这个onClick方法中点击apply(可能是提交或设置),用isSelected()方法检查每个人的状态,然后做根据每个复选框需要完成的工作,可能每个复选框负责不同的事情,因此每个复选框无论是否选中都会调用特定的方法来处理此状态(选中或未选中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多