您的位置:首页 > 其它

EditText实现(修改密码提示验证信息需求)

2016-08-31 20:50 603 查看
最近写博客的节奏懈怠了啊,因为公司终于来需求了,让我做密码管理功能模块,我也算是闲了个把月了,敲了一天代码,才找到以前的一点点感觉,哈哈~!!! 刚开始做就遇到奇葩产品订的需求,需要在EditText中提示密码错误啊,之类的提示,唉唉!没办法,只能硬着头皮上,于是写了个Demo,感觉挺简单哈……被自己欺骗了。

先给出githubdemo链接:https://github.com/913453448/EditViewDemo

看看demo的效果图:



不太好录屏,说一下产品的需求(想必大家都应该很清楚这些逻辑判断了):

1、当所有的输入框都输入的时候,“确定”按钮变为蓝色。

2、当某一项没有输入的时候点击“确定”按钮,焦点指向没输入的一项。

3、当密码没有满6位的时候在输入框中提示红色的“密码格式错误”,点击后恢复为灰色的“请输入六位密码”。

4、当原密码错误的时候提示红色的“原密码错误”

5……..一些细节我就不说了,运行下demo就可以啦~!

为什么写这篇博客呢,也就当一个笔记吧,以后再遇到的时候直接 copy了,如果有一样需求的直接拖走啊~!!

layout文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=match_parent
android:layout_height=match_parent
android:orientation=vertical
android:background=#eee
>
<LinearLayout
android:layout_width=match_parent
android:layout_height=wrap_content
android:orientation=horizontal
android:gravity=center_vertical
android:background=#fff
android:padding=15dp
>
<TextView
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=原密码:
/>
<EditText
android:id="@+id/id_orgin_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:background="@null"
android:inputType="numberPassword"
android:hint="请输入六位密码"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:background="#fff"
android:padding="15dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新密码:"
/>
<EditText
android:id="@+id/id_new_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:background="@null"
android:hint="请输入六位密码"
android:inputType="numberPassword"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:background="#fff"
android:padding="15dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认密码:"
/>
<EditText
android:id="@+id/id_confirm_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:background="@null"
android:hint="请输入六位密码"
android:inputType="numberPassword"
/>
</LinearLayout>
<Button
android:id="@+id/id_confirm_bt"
android:layout_marginTop="15dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_width="match_parent"
android:layout_height="44dp"
android:text="确定"
android:textSize="15sp"
android:textColor="#fff"
android:background=@drawable/button_selector
/>
</LinearLayout>


布局还是比较简单啊,想必大家分分钟就敲出来了,

先说说Button在蓝色selector与灰色selector切换方式:

这里偷了下懒,直接用一个selector文件就搞定了,当按钮的状态为android:state_pressed=”true” 并且android:state_selected=”true”这两个状态的时候设置background为蓝色,正常状态就为灰色了。然后通过不断监听三个EditText的内容变换动态的设置Button的setSelected()来控制按钮颜色。

<?xml version=1.0 encoding=utf-8?>
<selector xmlns:android=http://schemas.android.com/apk/res/android>
<item android:state_pressed=true
android:state_selected=true>
<shape>
<corners android:radius=5dp>
</corners>
</solid>
</shape>
</item>
<item android:state_selected=false>
<shape>
<corners android:radius=5dp>
</corners>
<solid android:color=@android:color/darker_gray>
</solid>
</shape>
</item>
<item>
<shape>
<corners android:radius=5dp>
</corners>
<solid android:color=@color/colorPrimary></solid>
</shape>
</item>
</selector>


对应MainActivity中代码:

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
/**
* 当三个EditText的内容都不为空的时候,
* Button为蓝色,否则为灰色通过
* bt_confirm.setSelected(true)实现蓝色,
*  bt_confirm.setSelected(false);实现灰色
*/
if(!TextUtils.isEmpty(et_confirm.getText().toString())&&!TextUtils.isEmpty(et_orgin.getText().toString())
&&!TextUtils.isEmpty(et_new.getText().toString())){
bt_confirm.setSelected(true);
}else{
bt_confirm.setSelected(false);
}
}

@Override
public void afterTextChanged(Editable s) {

}


是不是很简单,哭死,以前我还手动设置背景那种方式不断的切换背景从而达到变色效果,真是慢慢的进步啊。

下面 说说在EditText中展示提示语:也就是动态设置EditText的hint内容和hint的颜色,然后通过et.requestFocus();方法使焦点放在指定的EditText上。

方法都挺简单的,主要看代码逻辑了。

我直接贴出逻辑判断的所有代码了,大家应该都看得懂:

package com.cisetech.editviewdemo;

import android.app.ProgressDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements TextWatcher, View.OnClickListener {
private EditText et_orgin;
private EditText et_new;
private EditText et_confirm;
private Button bt_confirm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
et_orgin= (EditText) findViewById(R.id.id_orgin_et);
et_confirm= (EditText) findViewById(R.id.id_confirm_et);
et_new= (EditText) findViewById(R.id.id_new_et);
bt_confirm= (Button) findViewById(R.id.id_confirm_bt);
et_confirm.addTextChangedListener(this);
et_orgin.addTextChangedListener(this);
et_new.addTextChangedListener(this);
bt_confirm.setSelected(false);
bt_confirm.setOnClickListener(this);
et_orgin.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clearAll();
return false;
}
});
et_new.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clearAll();
return false;
}
});
et_confirm.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clearAll();
return false;
}
});
}
private void initData() {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
/**
* 当三个EditText的内容都不为空的时候,
* Button为蓝色,否则为灰色通过
* bt_confirm.setSelected(true)实现蓝色,
*  bt_confirm.setSelected(false);实现灰色
*/
if(!TextUtils.isEmpty(et_confirm.getText().toString())&&!TextUtils.isEmpty(et_orgin.getText().toString())
&&!TextUtils.isEmpty(et_new.getText().toString())){
bt_confirm.setSelected(true);
}else{
bt_confirm.setSelected(false);
}
}

@Override
public void afterTextChanged(Editable s) {

}
private ProgressDialog dialog;
@Override
public void onClick(View v) {
if(checkNull()){
return;
}
if(!et_confirm.getText().toString().equals(et_new.getText().toString())){
et_confirm.setText("");
requstFocus(et_confirm, "两次密码不一致", Color.RED,true);
return;
}
dialog=ProgressDialog.show(this,"","修改中,请稍后...",true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(!"123456".equals(et_orgin.getText().toString())){
et_orgin.setText("");
requstFocus(et_orgin, "原密码错误", Color.RED, true);
}else{
Toast.makeText(MainActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
},3000);
}

private boolean checkNull() {
if(TextUtils.isEmpty(et_orgin.getText().toString())){
requstFocus(et_orgin, null, Color.GRAY,true);
return true;
}
if(et_orgin.getText().toString().length()<6){
et_orgin.setText("");
requstFocus(et_orgin, "原密码格式错误", Color.RED,true);
return true;
}
if(TextUtils.isEmpty(et_new.getText().toString())){
requstFocus(et_new, null, Color.GRAY,true);
return true;
}
if(et_new.getText().toString().length()<6){
et_new.setText("");
requstFocus(et_new, "新密码格式错误", Color.RED,true);
return true;
}
if(TextUtils.isEmpty(et_confirm.getText().toString())){
requstFocus(et_confirm,null, Color.GRAY,true);
return true;
}
return false;
}
public void requstFocus(EditText et,String hint,int hintColor,boolean needFocus){
if(hint==null){
hint="请输入六位密码";
}
et.setHint(hint);
et.setHintTextColor(hintColor);
if(needFocus){
et.requestFocus();
}
}
public void clearAll(){
requstFocus(et_orgin, null, Color.GRAY,false);
requstFocus(et_new, null, Color.GRAY,false);
requstFocus(et_confirm,null, Color.GRAY,false);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐