Created
March 14, 2017 14:37
-
-
Save messenger63/abbd178f9bee909aec69feb9ace8758a to your computer and use it in GitHub Desktop.
Custom view for pin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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