【发布时间】: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