以编程方式添加后,无法通过id查找视图

时间:2014-07-17 15:44:00

标签: android android-activity

我有一个以编程方式添加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()方法中找到。

1 个答案:

答案 0 :(得分:2)

您必须将addCheckBox(element, value);更改为addCheckBox(field, value);否则他们都会获得与第一个相同的ID。