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

最近写博客的节奏懈怠了啊,因为公司终于来需求了,让我做密码管理功能模块,我也算是闲了个把月了,敲了一天代码,才找到以前的一点点感觉,哈哈~!!! 刚开始做就遇到奇葩产品订的需求,需要在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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值