这篇文章主要为大家详细介绍了Android自定义密码输入EditTextLayout,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文为大家分享了Android自定义密码输入的具体代码,供大家参考,具体内容如下
布局
<?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());
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:Android自定义密码输入EditTextLayout
基础教程推荐
猜你喜欢
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- Android实现短信验证码输入框 2023-04-29
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- iOS开发 全机型适配解决方法 2023-01-14
- Android开发Compose集成高德地图实例 2023-06-15
- iOS开发使用XML解析网络数据 2022-11-12
- IOS获取系统相册中照片的示例代码 2023-01-03
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- Flutter进阶之实现动画效果(三) 2022-10-28