类似支付宝的6个密码输入框

重写一个横向的线性布局,6个输入框,平均每个权重1

设置密码输入属性:

			tv.setInputType(InputType.TYPE_CLASS_TEXT
					| InputType.TYPE_TEXT_VARIATION_PASSWORD);


还不够,需要限制成只能数字输入,让他只能输入0-9数字,需要是使用:

tv.setKeyListener(new NumberKeyListener() {

				protected char[] getAcceptedChars() {
					char[] numberChars = { '1', '2', '3', '4', '5', '6', '7','8', '9', '0' };
					return numberChars;
				}

				@Override
				public int getInputType() {
					return InputType.TYPE_CLASS_NUMBER;
				}
			});
输入或删除后,让他调到下一个edittext即可。



import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.text.method.NumberKeyListener;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;

@SuppressLint("NewApi")
public class PassworldTextView extends LinearLayout {
	private Context mcontext;
	private static final int PWDLENGTH = 6;// 密码长度

	private static List<EditText> views;

	public PassworldTextView(Context paramContext) {
		super(paramContext);
		init(paramContext);
	}

	public PassworldTextView(Context paramContext,
			AttributeSet paramAttributeSet) {
		super(paramContext, paramAttributeSet);
		init(paramContext);
	}

	public PassworldTextView(Context paramContext,
			AttributeSet paramAttributeSet, int paramInt) {
		super(paramContext, paramAttributeSet, paramInt);
		init(paramContext);
	}

	public String getText() {
		 StringBuffer sb = new StringBuffer();
		 for (EditText edt : views) {
		 <span style="white-space:pre">	</span>sb.append(edt.getText().toString());
		 }
		 return sb.toString();
	}

	private void init(Context context) {
		mcontext = context;
		this.setOrientation(LinearLayout.HORIZONTAL);
		removeAllViews();
		views = new ArrayList<EditText>();
		for (int i = 0; i < PWDLENGTH; i++) {
			EditText tv = new EditText(mcontext);
			tv.setInputType(InputType.TYPE_CLASS_TEXT
					| InputType.TYPE_TEXT_VARIATION_PASSWORD);
			// tv.setInputType(InputType.TYPE_CLASS_NUMBER
			// | InputType.TYPE_TEXT_VARIATION_PASSWORD);

			tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
					LayoutParams.FILL_PARENT, 1));
			tv.setGravity(Gravity.CENTER);
			tv.setBackgroundResource(R.drawable.bg_edittext_normal);
			// tv.setKeyListener(new
			// // DigitsKeyListener(sign, decimal));
			// DigitsKeyListener(false, true));
			tv.setKeyListener(new NumberKeyListener() {

				protected char[] getAcceptedChars() {
					char[] numberChars = { '1', '2', '3', '4', '5', '6', '7','8', '9', '0' };
					return numberChars;
				}

				@Override
				public int getInputType() {
					return InputType.TYPE_CLASS_NUMBER;
				}
			});

			views.add(tv);

			final int index = i;
			tv.addTextChangedListener(new TextWatcher() {
				@Override
				public void onTextChanged(CharSequence chars, int arg1,
						int arg2, int arg3) {

				}

				@Override
				public void beforeTextChanged(CharSequence arg0, int arg1,
						int arg2, int arg3) {

				}

				@Override
				public void afterTextChanged(Editable editable) {
					if (editable.toString().equals("")) {
						// 删完,光标左移
						if (index > 0) {
							EditText edt = views.get(index - 1);
							reSet(edt);
						}
					} else if (editable.length() == 1) {
						// 写好一个,往后移
						if (editable.length() == 1 && index < views.size() - 1) {
							EditText edt = views.get(index + 1);

							// edt.setText("*");

							reSet(edt);
						}
					} else {
						EditText edt = null;
						for (int j = 0; j < editable.length(); j++) {
							if ((j + index) < views.size()) {// j!=0 &&
								edt = views.get(index + j);
								edt.setText(editable.subSequence(j, j + 1));
							}
						}
						if (edt != null) {
							reSet(edt);
						}
					}
				}
			});
			tv.setOnKeyListener(new OnKeyListener() {
				@Override
				public boolean onKey(View arg0, int key, KeyEvent arg2) {
					EditText edt = (EditText) arg0;
					if (edt.getText().length() == 0 && index > 0) {
						edt = views.get(index - 1);
						reSet(edt);
					}
					return false;
				}
			});
			this.addView(tv);
		}
	}

	private void reSet(EditText edt) {
		edt.setFocusable(true);
		edt.requestFocus();
		edt.setSelection(edt.length());
	}
}




你可能感兴趣的:(android)