我有一个以编程方式添加CheckBox,EditText等View元素的方法..这是我的方法。
private void addCheckBox(JSONObject element, boolean visible)
{
CheckBox checkbox = new CheckBox(context);
checkbox.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT
));
checkbox.setText(element.get("label").toString());
checkbox.setId(Math.abs(element.get("id").toString().hashCode()));
if(!visible)
{
checkbox.setVisibility(View.GONE);
}
checkbox.setChecked(Boolean.getBoolean(element.get("value").toString()));
layout.addView(checkbox);
}
现在我有第二种方法,我有一组可以通过复选框切换的元素。
private void addGroup(JSONObject element)
{
// Add toggle checkbox
addCheckBox(element, true);
// Get propery for the toggle checkbox
int id = Math.abs(element.get("id").toString().hashCode());
boolean value = Boolean.parseBoolean(element.get("value").toString());
final CheckBox toggle = (CheckBox) context.findViewById(id);
// Get rest of the fields
JSONArray fields = (JSONArray) element.get("fields");
final ArrayList<Integer> tags = new ArrayList<Integer>();
// Add all fields to the layout
for(int i = 0; i < fields.size(); i++)
{
// Append each field belonging to this group
JSONObject field = (JSONObject) fields.get(i);
String type = field.get("type").toString();
switch (type)
{
case "checkbox":
addCheckBox(element, value);
tags.add(Math.abs(field.get("id").toString().hashCode()));
break;
...
}
}
// Set toggle action for group elements
toggle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// Toggle element visibility depending on toggle checbox state
View view = (View) context.findViewById(1718389591);
Log.w("JSON", "E:" + view.toString());
}
});
}
但是行Log.w("JSON", "E:" + view.toString());
是一个空指针异常。当我第一次调用addCheckBox()
时,UI元素被创建并添加到布局中,我能够在id值int id = Math.abs(element.get("id").toString().hashCode());
中找到它,但是即使元素在屏幕上呈现,永远不会在onClick()
方法中找到。
答案 0 :(得分:2)
您必须将addCheckBox(element, value);
更改为addCheckBox(field, value);
否则他们都会获得与第一个相同的ID。