Skip to content

Instantly share code, notes, and snippets.

@messenger63
Created March 14, 2017 14:37
Show Gist options
  • Save messenger63/abbd178f9bee909aec69feb9ace8758a to your computer and use it in GitHub Desktop.
Save messenger63/abbd178f9bee909aec69feb9ace8758a to your computer and use it in GitHub Desktop.
Custom view for pin
import android.annotation.TargetApi;
import android.app.Service;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.support.annotation.DrawableRes;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class PinView extends LinearLayout implements TextWatcher, View.OnClickListener {
private int mFieldCount;
private float mFieldSize;
private float mFieldVerticalMargin;
private float mFieldHorizontalMargin;
private
@DrawableRes
int mDrawableEmpty;
private
@DrawableRes
int mDrawableFilled;
private EditText mEdiText;
private ImageView[] mImageViews;
private OnPinEnteredListener mListener;
public PinView(Context context) {
super(context);
init(context, null, 0, 0);
}
public PinView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0, 0);
}
public PinView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr, 0);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public PinView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs, defStyleAttr, defStyleRes);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.PinView, defStyleAttr, defStyleRes);
try {
mFieldCount = a.getInteger(R.styleable.PinView_fieldsCount, 4);
mFieldSize = a.getDimension(R.styleable.PinView_field_size,
getResources().getDimension(R.dimen.pin_default_field_size));
mFieldVerticalMargin = a.getDimension(R.styleable.PinView_field_vertical_margin,
getResources().getDimension(R.dimen.pin_default_field_vertical_margin));
mFieldHorizontalMargin = a.getDimension(R.styleable.PinView_field_horizontal_margin,
getResources().getDimension(R.dimen.pin_default_field_horizontal_margin));
mDrawableEmpty = a.getResourceId(R.styleable.PinView_drawable_empty, -1);
mDrawableFilled = a.getResourceId(R.styleable.PinView_drawable_filled, -1);
} finally {
a.recycle();
}
initViews();
}
private void initViews() {
this.setOrientation(HORIZONTAL);
mEdiText = new EditText(getContext());
mEdiText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mFieldCount)});
mEdiText.setInputType(InputType.TYPE_CLASS_NUMBER);
mEdiText.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
mEdiText.setLayoutParams(new LayoutParams(0, 1));
mEdiText.addTextChangedListener(this);
addView(mEdiText);
mImageViews = new ImageView[mFieldCount];
for (int i = 0; i < mFieldCount; i++) {
ImageView imageView = new ImageView(getContext());
LayoutParams params = new LayoutParams((int) mFieldSize, (int) mFieldSize);
params.setMargins(
(int) mFieldHorizontalMargin,
(int) mFieldVerticalMargin,
(int) mFieldHorizontalMargin,
(int) mFieldVerticalMargin
);
imageView.setLayoutParams(params);
imageView.setImageResource(mDrawableEmpty);
mImageViews[i] = imageView;
addView(mImageViews[i]);
}
setOnClickListener(this);
}
@Override
public void beforeTextChanged(CharSequence text, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable editable) {
}
@Override
public void onTextChanged(CharSequence text, int start, int count, int after) {
for (int i = 0; i < mFieldCount; i++) {
mImageViews[i].setImageResource(text.length() > i ? mDrawableFilled : mDrawableEmpty);
}
if (text.length() == mFieldCount) {
if (mListener != null)
mListener.onEnter(text.toString());
}
}
@Override
public void onClick(View view) {
mEdiText.requestFocus();
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEdiText, 0);
}
public void clear() {
mEdiText.setText("");
}
public OnPinEnteredListener getOnPinEnteredListener() {
return mListener;
}
public void setOnPinEnteredListener(OnPinEnteredListener listener) {
mListener = listener;
}
public interface OnPinEnteredListener {
void onEnter(String pin);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment