Android_登录
账号密码长度的监视和校验
1.我们通过监视账号密码的长度来判断用户输入信息是否合法,可以把登录按钮设为可用或不可用,更直观的就是设置登录按钮是灰色或者是其他颜色. 2.我们在监视长度后,还可以在焦点状态改变的时候校验用户输入的账号是不是合法.一般我们使用的是手机号的作为账号的话直接可以和用户交互. 3.一般我们希望可以直接删除输入错误的账号或者密码字符,还有就是密码最好是可以显示和隐藏的.
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:background="#ffffff" android:orientation="vertical" android:layout_width="match_parent" android:gravity="center" android:padding="20dp" android:layout_height="match_parent" tools:context="com.demo.aswitch.login.LoginActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="30dp" android:background="@drawable/yuanjiaojvxing" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:padding="5dp" android:src="@drawable/zy02_user" /> <EditText android:id="@+id/username" style="@style/login_style" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:hint="手机号" android:inputType="phone" android:maxLength="11" android:singleLine="true" /> <ImageView android:id="@+id/acc_del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="true" android:padding="10dp" android:src="@drawable/b_del" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="20dp" android:background="@drawable/yuanjiaojvxing" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:padding="5dp" android:src="@drawable/zy02_pwd" /> <EditText android:id="@+id/password" style="@style/login_style" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:hint="登录密码" android:inputType="textPassword" android:maxLength="12" android:singleLine="true" /> <ImageView android:id="@+id/pas_del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="true" android:padding="5dp" android:src="@drawable/b_del" android:visibility="gone" /> <ImageView android:id="@+id/eye" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="true" android:padding="5dp" android:src="@drawable/zy02_no" /> </LinearLayout> <Button android:id="@+id/btn_login" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="40dp" android:background="#ff0000" android:gravity="center" android:text="登录" android:textColor="#ffffff" android:textSize="18sp" /> </LinearLayout>
代码实现
public class LoginActivity extends AppCompatActivity implements View.OnClickListener { private EditText username; private ImageView acc_del; private EditText password; private ImageView pas_del; private ImageView eye; private Button btn_login; private boolean beye; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initView(); } private void initView() { username = (EditText) findViewById(R.id.username); acc_del = (ImageView) findViewById(R.id.acc_del); password = (EditText) findViewById(R.id.password); pas_del = (ImageView) findViewById(R.id.pas_del); eye = (ImageView) findViewById(R.id.eye); btn_login = (Button) findViewById(R.id.btn_login); acc_del.setOnClickListener(this); pas_del.setOnClickListener(this); eye.setOnClickListener(this); btn_login.setOnClickListener(this); //文本监视 username.addTextChangedListener(new EditChangedListener(username)); //焦点监视 username.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { if (TextUtils.isEmpty(password.getText().toString().trim())) { setUsable(false); } if (!TextUtils.isEmpty(username.getText().toString().trim())) { acc_del.setVisibility(View.VISIBLE); pas_del.setVisibility(View.GONE); } } } }); //文本监视 password.addTextChangedListener(new EditChangedListener(password)); //焦点监视 password.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { if (!TextUtils.isEmpty(password.getText().toString().trim())) { acc_del.setVisibility(View.GONE); pas_del.setVisibility(View.VISIBLE); } if (TextUtils.isEmpty(username.getText().toString().trim())) { getFocus(username); return; } } } }); //初始化不可用 setUsable(false); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.acc_del: username.setText(""); password.setText(""); getFocus(username); break; case R.id.pas_del: getFocus(password); password.setText(""); break; case R.id.eye: if (beye) { eye.setImageResource(R.drawable.zy02_no); //变为** password.setTransformationMethod(PasswordTransformationMethod.getInstance()); } else { eye.setImageResource(R.drawable.zy02_yes); //显示正常字符 password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); } //取反赋值 beye = !beye; //视图重绘 password.postInvalidate(); //切换后将EditText光标置于末尾 CharSequence charSequence = password.getText(); if (charSequence instanceof Spannable) { Spannable spanText = (Spannable) charSequence; Selection.setSelection(spanText, charSequence.length()); } break; case R.id.btn_login: break; } } //实现TextWatcher class EditChangedListener implements TextWatcher { private EditText et; public EditChangedListener(EditText et) { this.et = et; } /** * 文本改变之前的状态,将要改变 * * @param s 文本 * @param start 替换开始位置 * @param count 要替换的字符数 * @param after 替换为after个字符 */ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (s.length() > 0) { acc_del.setVisibility(View.VISIBLE); pas_del.setVisibility(View.GONE); } } /** * 字符改变时的状态 * * @param s 文本 * @param start 替换开始位置 * @param before 之前的字符数 * @param count 添加的字符数 就是你一次输入的字符长度 */ @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.e("main", "onTextChanged---输入字符长度" + count); Log.e("main", "onTextChanged---" + s.toString()); } /** * 字符改变后的状态,最终的文本s * * @param s */ @Override public void afterTextChanged(Editable s) { Log.e("main", s.toString()); if (et.getId() == R.id.username && s.length() == 11 && !Validator.isMobile(s.toString())) { Toast.makeText(LoginActivity.this, "手机号格式不正确!", Toast.LENGTH_SHORT).show(); getFocus(et); } Log.e("main", "afterTextChanged---最终的字符长度" + s.length()); if (s.length() == 0) { if (et.getId() == R.id.password) { pas_del.setVisibility(View.GONE); } else { acc_del.setVisibility(View.GONE); } setUsable(false); } else { if (et.getId() == R.id.password) { acc_del.setVisibility(View.GONE); pas_del.setVisibility(View.VISIBLE); if (s.length() >= 6) { setUsable(true); } else { setUsable(false); } } else { acc_del.setVisibility(View.VISIBLE); pas_del.setVisibility(View.GONE); } } } } private void setUsable(boolean enabled) { if (enabled) { btn_login.setEnabled(enabled); btn_login.setBackgroundColor(getResources().getColor(R.color.red)); } else { btn_login.setEnabled(enabled); btn_login.setBackgroundColor(getResources().getColor(R.color.color_h2)); } } private void getFocus(EditText editText) { editText.setText(""); editText.requestFocus(); editText.setFocusableInTouchMode(true); editText.requestFocus(); } }