public class NumberSelect extends LinearLayout { Button addButton; Button minusButton; TextView valueTextView; private int minValue; private int maxValue; private int defaultValue; private int textValue; public interface NumberSelectListener { public void onValueChange(int value); } private NumberSelectListener listener; public NumberSelect(Context context) { super(context); init(context, null); } public NumberSelect(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public NumberSelect(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } private void init(Context context, AttributeSet attrs) { View.inflate(context, R.layout.number_select, this); setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS); this.addButton = (Button) findViewById(R.id.addButton); this.minusButton = (Button) findViewById(R.id.minusButton); this.valueTextView = (TextView) findViewById(R.id.valueTextView); this.textValue = 0; this.maxValue = Integer.MAX_VALUE; this.minValue = 0; if (attrs != null) { TypedArray attributes = context.getTheme().obtainStyledAttributes( attrs, R.styleable.NumberSelect, 0, 0); this.maxValue = attributes.getInt(R.styleable.NumberSelect_max_value, this.maxValue); this.minValue = attributes.getInt(R.styleable.NumberSelect_min_value, this.minValue); this.defaultValue = attributes.getInt(R.styleable.NumberSelect_default_value, 0); this.valueTextView.setText(String.valueOf(defaultValue)); } this.addButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { addTextValue(); if ( listener != null) { listener.onValueChange(textValue); } } }); this.minusButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { minusTextValue(); if ( listener != null) { listener.onValueChange(textValue); } } }); } public void setMaxValue(int value) { this.maxValue = value; } public void setMinValue(int value) { this.minValue = value; } public void setDefaultValue(int value) { this.defaultValue = value; } private void addTextValue(){ if ( this.textValue < this.maxValue) { this.textValue++; this.valueTextView.setText(String.valueOf(this.textValue)); } } private void minusTextValue(){ if ( this.textValue > this.minValue) { this.textValue--; this.valueTextView.setText(String.valueOf(this.textValue)); } } public void setListener(NumberSelectListener listener) { this.listener = listener; } }