本文为大家分享了Android自定义密码输入的具体代码,供大家参考,具体内容如下
布局
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<? 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 > |
用于密码输入的自定义控件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/** * 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()); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/showdy/article/details/62226770