J'essaie d'écrire mon propre CheckBox
en utilisant RelativeLayout
avec TextView
et FrameLayout
(avec le sélecteur sur le fond) à l'intérieur.Faire RelativeLayout vérifiable
J'ai setDuplicateParentStateEnabled(true)
pour FrameLayout
que cela prenne l'état vérifiable du parent, mais pourquoi faire RelativeLayout
vérifiable je ne sais pas.
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 < 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();
}
}
Essayé. Ne fonctionne pas sur 4.0.3 X- ( – Mus
Mus, mon application fonctionne sur 4.0.3 et 4.1.1 bien avec ce code – Nik
Pouvez-vous poster votre mise en page XML? J'ai aussi des problèmes. Avez-vous mis android: clickable = "true" dans la mise en page par hasard? –