您好,登錄后才能下訂單哦!
Android中怎么利用EditTextLayout自定義密碼輸入?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
布局
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/delete" android:layout_width="30dp" android:layout_height="48dp" android:layout_gravity="center" android:scaleType="center" android:src="@drawable/ico_delete"/> <CheckBox android:id="@+id/ck_shift" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/pwd_selector" android:button="@null"/> </merge>
用于密碼輸入的自定義控件
/** * Created by showdy on 2017/3/15. * <p> * 一個用于密碼輸入的自定義控件 */ public class PwdEditLayout extends LinearLayout implements TextWatcher, View.OnFocusChangeListener, View.OnClickListener, CompoundButton.OnCheckedChangeListener { private ImageView mDeleteIcon; private CheckBox mShiftIcon; private EditText mEditText; public PwdEditLayout(Context context) { this(context, null); } public PwdEditLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PwdEditLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOrientation(HORIZONTAL); setCustomBackground(); } private void setCustomBackground() { GradientDrawable gd = new GradientDrawable(); gd.setCornerRadius(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 4, Resources.getSystem().getDisplayMetrics())); gd.setStroke((int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 1, Resources.getSystem().getDisplayMetrics()), Color.BLUE); if (Build.VERSION.SDK_INT < 16) { this.setBackgroundDrawable(gd); } else { this.setBackground(gd); } } /** * Called when a new child is aded to this ViewGroup. Overrides should always * call super.onViewAdded. * * @param child the added child view */ @Override public void onViewAdded(View child) { super.onViewAdded(child); if (child instanceof EditText) { if (getChildCount() != 1) { throw new IllegalArgumentException("Only one EditText can be added in this layout."); } mEditText = (EditText) child; mEditText.setBackgroundColor(Color.TRANSPARENT); //關鍵點1 LayoutInflater.from(getContext()).inflate(R.layout.layout_edittext_pwd, this, true); mDeleteIcon = (ImageView) findViewById(R.id.delete); mShiftIcon = (CheckBox) findViewById(R.id.ck_shift); //關鍵點2 setAddStatesFromChildren(true); //使得父類獲得和子控件相同的狀態 mEditText.addTextChangedListener(this); mEditText.setOnFocusChangeListener(this); mDeleteIcon.setOnClickListener(this); mShiftIcon.setOnCheckedChangeListener(this); //設置默認狀態---刪除按鈕和是否顯示密碼 mShiftIcon.setChecked(false); updateDeleteIcon(mEditText.getText().toString(), mEditText.isFocused()); updateShowPassword(mShiftIcon.isChecked()); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { updateDeleteIcon(s.toString(), mEditText.isFocused()); } @Override public void afterTextChanged(Editable s) { } @Override public void onFocusChange(View v, boolean hasFocus) { updateDeleteIcon(mEditText.getText().toString(), hasFocus); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.delete: mEditText.setText(""); break; } } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { updateShowPassword(isChecked); } /** * 用于是否顯示密碼 * * @param password * @param focused */ private void updateDeleteIcon(String password, boolean focused) { if (!TextUtils.isEmpty(password) && focused) { mDeleteIcon.setVisibility(VISIBLE); } else { mDeleteIcon.setVisibility(INVISIBLE); } } /** * 用于控制是否顯示密碼 * * @param checked */ private void updateShowPassword(boolean checked) { if (checked) { mEditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } else { mEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); } mEditText.setSelection(mEditText.getText().toString().length()); } }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。