【发布时间】:2021-10-07 15:52:15
【问题描述】:
我想保存选中的复选框并获取它们的字符串值。
我目前正在做的是使用一系列复选框(大约 20 cbs)
声明(onCreateView 之外)
CheckBox checkboxNslWing, checkboxNsfDoor, checkboxNsrDoor, checkboxNsrQuarter, checkboxNsRoofRail, checkboxOsfWing, checkboxOsfDoor, checkboxOsrDoor, checkboxOsrQuarter, checkboxOsRoofRail, checkboxBonnet, checkboxRoof, checkboxTailgate, checkboxNsSill, checkboxOsSill, checkboxNsSlidingDoor, checkboxOsSlidingDoor, checkboxFrontBumper, checkboxBackBumper, checkboxMotorbikeTank;
private CheckBox[] allCheckBoxes;
内部onCreateView
// Set Checkboxes properties
checkboxNslWing = (CheckBox) v.findViewById(R.id.NslWing);
checkboxNsfDoor = (CheckBox) v.findViewById(R.id.NsfDoor);
checkboxNsrDoor = (CheckBox) v.findViewById(R.id.NsrDoor);
checkboxNsrQuarter = (CheckBox) v.findViewById(R.id.NsrQuarter);
checkboxNsRoofRail = (CheckBox) v.findViewById(R.id.NsRoofRail);
checkboxOsfWing = (CheckBox) v.findViewById(R.id.OsfWing);
checkboxOsfDoor = (CheckBox) v.findViewById(R.id.OsfDoor);
checkboxOsrDoor = (CheckBox) v.findViewById(R.id.OsrDoor);
checkboxOsrQuarter = (CheckBox) v.findViewById(R.id.OsrQuarter);
checkboxOsRoofRail = (CheckBox) v.findViewById(R.id.OsRoofRail);
checkboxBonnet = (CheckBox) v.findViewById(R.id.Bonnet);
checkboxRoof = (CheckBox) v.findViewById(R.id.Roof);
checkboxTailgate = (CheckBox) v.findViewById(R.id.TailgateBoot);
checkboxNsSill = (CheckBox) v.findViewById(R.id.NsSill);
checkboxOsSill = (CheckBox) v.findViewById(R.id.OsSill);
checkboxNsSlidingDoor = (CheckBox) v.findViewById(R.id.NsSlidingDoor);
checkboxOsSlidingDoor = (CheckBox) v.findViewById(R.id.OsSlidingDoor);
checkboxFrontBumper = (CheckBox) v.findViewById(R.id.FrontBumper);
checkboxBackBumper = (CheckBox) v.findViewById(R.id.BackBumper);
checkboxMotorbikeTank = (CheckBox) v.findViewById(R.id.MotorbikeTank);
allCheckBoxes = new CheckBox[] {checkboxNslWing, checkboxNsfDoor, checkboxNsrDoor, checkboxNsrQuarter, checkboxNsRoofRail, checkboxOsfWing, checkboxOsfDoor, checkboxOsrDoor, checkboxOsrQuarter, checkboxOsRoofRail, checkboxBonnet, checkboxRoof, checkboxTailgate, checkboxNsSill, checkboxOsSill, checkboxNsSlidingDoor, checkboxOsSlidingDoor, checkboxFrontBumper, checkboxBackBumper, checkboxMotorbikeTank};
int cb = 0;
CheckListener listener = new CheckListener();
for (CheckBox box : allCheckBoxes) {
box.setOnCheckedChangeListener(listener);
box.setTag(1 << cb);
cb++;
if (box.isChecked())
{
Toast.makeText(getContext(), box.getText().toString(), Toast.LENGTH_LONG).show();
Log.d("Operation", box.getText().toString());
}
}
onCheckedChanged
class CheckListener implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
for (int i=0; i<=19; i++)
{
if (allCheckBoxes[i].isChecked())
{
// Toast.makeText(getContext(), allCheckBoxes[i].getText().toString(), Toast.LENGTH_LONG).show();
Log.d("Operation", allCheckBoxes[i].getText().toString());
}
}
}
}
以上工作完全正常,我可以看到显示复选框被选中的日志,当我尝试将复选框保存在数据库中时,我的问题如下。虽然它有效,但它只保存了最后一个选中的复选框,而不是之前选中的任何其他复选框。例如。如果我检查 1,2,3,4 它只会保存数字 4。
else if ("Multiple".contentEquals(sel)) {
for (int i=0; i<=19; i++)
{
if (allCheckBoxes[i].isChecked())
{
damage.setDescription(sel+" "+allCheckBoxes[i].getText().toString());
}
}
}
保存到数据库的完整方法
public String saveDamage(String vehicleId, String damageId) {
Damage damage = new Damage();
Vehicle vehicle = new Vehicle();
damage.setVehicleId(new Integer(vehicleId));
if (damageId != null) {
damage.setId(new Integer(damageId));
}
if (vehicleId != null) {
vehicle.setId(new Integer(vehicleId));
}
String sel = spinner.getSelectedItem().toString();
if ("Left".contentEquals(sel) || "Right".contentEquals(sel)) {
String sel3 = spinner3.getSelectedItem().toString();
damage.setDescription(sel+" "+sel3);
}
else if ("Front".contentEquals(sel)) {
String sel2 = spinner2.getSelectedItem().toString();
damage.setDescription(sel+" "+sel2);
}
else if ("Rear".contentEquals(sel)) {
String sel4 = spinner4.getSelectedItem().toString();
damage.setDescription(sel+" "+sel4);
}
else if ("Roof".contentEquals(sel)) {
String sel5 = spinner5.getSelectedItem().toString();
damage.setDescription(sel+" "+sel5);
}
else if ("Multiple".contentEquals(sel)) {
for (int i=0; i<=19; i++)
{
if (allCheckBoxes[i].isChecked())
{
damage.setDescription(sel+" "+allCheckBoxes[i].getText().toString());
}
}
}
damage.setNotes(txtEditNotes.getText().toString());
try {
damage.setCost(Double.valueOf(Objects.requireNonNull(txtEditCost.getText()).toString()));
} catch(NumberFormatException e) {
damage.setCost(0d);
}
String supCost = txtSupplementTotal.getText().toString().trim();
supCost = supCost.replace("£", "");
String supCostTotal = (String) (supCost);
String deCost = txtDetailedEstimatorTotal.getText().toString().trim();
deCost = deCost.replace("£", "");
deCost = deCost.replace(",", "");
String deCostTotal = (String) (deCost);
damage.setSupplementTotal(Double.valueOf(supCostTotal));
damage.setDetailedEstimatorTotal(Double.valueOf(deCostTotal));
vehicle.setTotal(damage.getTotal());
DamageRepository damageRepository = new DamageRepository(getActivity().getApplication());
if (damageId != null) {
damageRepository.update(damage);
return damageId;
}
long insertId = 0;
try {
Future<Long> future = damageRepository.insert(damage);
insertId = future.get();
} catch (ExecutionException e) {
e.printStackTrace();
Toast.makeText(getContext(), "Failed saving data", Toast.LENGTH_LONG).show();
} catch (InterruptedException e) {
e.printStackTrace();
Toast.makeText(getContext(), "Failed saving data", Toast.LENGTH_LONG).show();
}
return String.valueOf(insertId);
}
【问题讨论】:
-
看看你的循环:你不断覆盖上一次迭代的数据集,例如在这里:
damage.setDescription(sel+" "+allCheckBoxes[i].getText().toString());。你认为damage.setDescription("sel 1"); damage.setDescription("sel 2");会导致什么结果?我假设您想追加 id,因此请相应地构建您的代码。 -
谢谢@Thomas 每个 sel 从使用的每个微调器中检索字符串值,我已经更改了它的表示方式,但问题不存在。
-
问题肯定存在。想想应该如何映射多个复选框和 one
damage对象。您需要拥有多个damage对象或组合您拥有的单个damage复选框的 ID。
标签: java android arrays android-fragments checkbox