title: Make RelativeLayout checkable
body: <p>I try to write my own <code>CheckBox</code> using <code>RelativeLayout</code> with <code>TextView</code> and <code>FrameLayout</code> (with selector on background) inside.</p>
  
  <p>I have <code>setDuplicateParentStateEnabled(true)</code> for <code>FrameLayout</code> that it take checkable status from parent, but why make <code>RelativeLayout</code> checkable I don't know.</p>
  
  <pre><code>public class MyCheckbox extends RelativeLayout implements OnClickListener, Checkable
  {
  private static final int ID_CHECKBOX = -1234411;
  private static final int ID_TEXTVIEW = -1234412;
  private static final int ID_PARENT = -1234413;
  
  private TextView textView;
  private FrameLayout checkBox;
  private boolean isChecked;
  
  public MyCheckbox(Context context)
  {
      this(context, null);
  }
  
  public MyCheckbox(Context context, AttributeSet attrs)
  {
      super(context, attrs);
  
      LayoutParams lp;
  
      setId(ID_PARENT);
      setOnClickListener(this);
  
      // checkBox
      checkBox = new FrameLayout(context);
      checkBox.setId(ID_CHECKBOX);
      checkBox.setDuplicateParentStateEnabled(true);
  
      // textView
      textView = new TextView(context);
      textView.setId(ID_TEXTVIEW);
      textView.setOnClickListener(this);
  
  
      boolean checkboxToRight = false;
  
      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MaptrixCheckbox);
  
      for (int i = 0; i &lt; a.getIndexCount(); i++)
      {
          int attr = a.getIndex(i);
          switch (attr)
          {
              case R.styleable.MyCheckbox_checkboxToRight:
                  checkboxToRight = a.getBoolean(attr, false);
                  break;
  
              case R.styleable.MyCheckbox_checkMark:
                  checkBox.setBackgroundDrawable(a.getDrawable(attr));
                  break;
  
              case R.styleable.MyCheckbox_text:
                  textView.setText(a.getText(attr));
                  break;
          }
      }
      a.recycle();
  
      if (checkboxToRight)
      {
          lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          lp.addRule(ALIGN_PARENT_RIGHT);
          lp.addRule(CENTER_VERTICAL);
          lp.setMargins(margins, 0, margins, 0);
          addView(checkBox, lp);
  
          lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
          lp.addRule(CENTER_VERTICAL);
          lp.addRule(LEFT_OF, ID_CHECKBOX);
          addView(textView, lp);
      }
      else
      {
          lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          lp.addRule(CENTER_VERTICAL);
          lp.setMargins(margins, 0, margins, 0);
          addView(checkBox, lp);
  
          lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
          lp.addRule(CENTER_VERTICAL);
          lp.addRule(RIGHT_OF, ID_CHECKBOX);
          addView(textView, lp);
      }
  
      refreshDrawableState();
  }
  
  @Override
  public void onClick(View v)
  {
      int id = v.getId();
  
      if (id == ID_PARENT || id == ID_TEXTVIEW) toggle();
  }
  
  public boolean isChecked()
  {
      return isChecked;
  }
  
  public void setChecked(boolean chacked)
  {
      isChecked = chacked;
      refreshDrawableState();
  }
  
  @Override
  public void toggle()
  {
      isChecked = !isChecked;
      refreshDrawableState();
  }
  }
  </code></pre>