先上代码
package com.example.signup;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// EditText et_name = findViewById(R.id.et_name);
// EditText et_pwd = findViewById(R.id.et_pwd);
public void register(View v) {
//要改变进度的progressBar对象要加final属性
final ProgressBar prg_horizontal = findViewById(R.id.prg_horizontal);
//使用逻辑运算符&&一个个排除,若有错,则输出出错位置的某种错误,不会继续往下判断,重复输出错误信息
if (checkEditRight(R.id.et_name) &&
checkEditRight(R.id.et_passWord) &&
checkEditRight(R.id.et_email) &&
checkEditRight(R.id.et_phone)
//判断无误后执行指定操作
) prgOK(prg_horizontal);
}
/**
* 获取输入框文本长度
* @param editText 输入框对象
* @return int 长度
*/
public int getEditLength(EditText editText) {
return editText.getText().toString().length();
}
/**
* 获取 EditText对应id的对象
* @param editTextID EditText对应id
* @return EditText对应id的对象
*/
public EditText getEditText(int editTextID) {
return (EditText) findViewById(editTextID);
}
/**
* 判断输入框是否为空(字符串)
* @param editText 输入框对象
* @return 为空为true 非空为false 并输出错误信息
*/
public boolean checkEditEmptyString(EditText editText) {
if (editText.getText().toString().equals("")) {
Toast.makeText(this, editText.getHint() + "为空", Toast.LENGTH_SHORT)
.show();//要使用show方法才能显示
return false;
}
return true;
}
/**
* 判断输入框文本长度是否大于等于输入框最小长度
* @param editTextID EditText对应id
* @param minLength 输入框最小长度
* @return 大于等于为true 小于为false 并输出错误信息
*/
public boolean checkEditLength(int minLength, int editTextID) {
if (getEditLength(getEditText(editTextID)) < minLength) {
Toast.makeText(this, getEditText(editTextID).getHint() + "最小长度为" +
minLength + "字符", Toast.LENGTH_SHORT)
.show();//要使用show方法才能显示
return false;
} else return true;
}
/**
* 判断输入框文本是否符合要求
* @param editTextID EditText对应id
* @return 符合为true 不符合为false 并输出对应错误的错误信息
*/
public boolean checkEditRight(int editTextID) {
if (checkEditEmptyString(
getEditText(editTextID)
)) {
switch (editTextID) {
case R.id.et_name:
return checkEditLength(3, editTextID);
case R.id.et_passWord:
return checkEditLength(6, editTextID);
case R.id.et_email:
return checkEditLength(10, editTextID);
case R.id.et_phone:
return checkEditLength(11, editTextID);
}
}
return false;
}
/**
* 显示对应进度条,并加载
* @param progressBar ProgressBar对象
*/
public void prgOK(final ProgressBar progressBar) {
//设置控件隐藏显示属性 的 方法
progressBar.setVisibility(View.VISIBLE);
//用线程持续设置进度,从1到100
new Thread() {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
progressBar.setProgress(i);
try {
Thread.sleep((long) (30 + Math.random() * 100));//随机时间间隔
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//线程要start才能运行
}.start();
}
}
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:gravity="center"
android:text="Sign up"
android:textColor="#fff"
android:textSize="50sp" />
<TextView
android:id="@+id/tv_verse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="To see a world in a grain of sand \n And a heaven in a wild flower"
android:textColor="#00C853" />
<!--@等价于/res文件夹??
Android:src="" 指定前景资源 不会因控件大小变化改变比例
Android:Background="" 背景 填满控件 会因控件大小改变比例-->
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="10dp"
android:gravity="center"
android:src="@drawable/add_photo" />
<!--
android:inputType 输入类型
textPassword 密码
number 正整数
numberSigned 正负整数
numberDecimal 小数
-->
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginHorizontal="50dp"
android:layout_marginTop="10dp"
android:background="@drawable/border"
android:gravity="center"
android:hint="User Name"
android:digits="@string/register_userName_limit"
android:maxLength="12"
android:singleLine="false"
android:textColor="#fff"
android:textColorHint="#ccc" />
<EditText
android:id="@+id/et_passWord"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginHorizontal="50dp"
android:layout_marginTop="20dp"
android:background="@drawable/border"
android:gravity="center"
android:hint="Password"
android:inputType="textPassword"
android:maxLength="16"
android:textColor="#fff"
android:textColorHint="#ccc" />
<EditText
android:id="@+id/et_email"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginHorizontal="50dp"
android:layout_marginTop="20dp"
android:background="@drawable/border"
android:gravity="center"
android:hint="Email Address"
android:inputType="textEmailAddress"
android:maxLength="32"
android:textColor="#fff"
android:textColorHint="#ccc" />
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginHorizontal="50dp"
android:layout_marginTop="20dp"
android:background="@drawable/border"
android:gravity="center"
android:hint="Phone"
android:inputType="phone"
android:maxLength="14"
android:textColor="#fff"
android:textColorHint="#ccc" />
<Button
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginHorizontal="30dp"
android:layout_marginTop="30dp"
android:background="@drawable/btn"
android:gravity="center"
android:onClick="register"
android:text="REGISTER"
android:textColor="#fff" />
<ProgressBar
android:id="@+id/prg_horizontal"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:visibility="invisible" />
</LinearLayout>
实现功能:
按下按钮 从第一个输入框往下判断
是否为空
是否小于指定的最小长度
若有错误Toast错误信息
总结:
使用多个方法分配各个功能,具有好的扩展性,也易于修改
反思与错误:
可在onCreate方法外定义控件,不可以实例化(还没有载入xml文件)
要改变进度的progressBar对象要加final属性
线程要记得加start才能运行
直接在控件里定义onClick属性相等方便
定义get对应控件id对象的方法,可以直接透过控件id,直接对控件进行操作,不用再定义实例化控件(可能有问题或缺陷?)
编程前最好想清楚逻辑,有哪些功能,有哪些功能是重复可写成方法的,避免一路写一路改
6.15改进:
switch不能判断对象,而if嵌套不方便阅读与维护,所以才使用getEditText方法获取对象的下策,每次使用都会创建一次性的对象,运行效率相对较低,并且会使代码相对繁冗,增加阅读维护难度.
现在发现可以使editText.getId()方法获取ID传入switch内判断,使代码变得更加易读
使用了类内定义对象,方法内实例化的正确方法,这样使全局都可以使用这个对象
package com.example.signup;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
EditText et_name;
EditText et_passWord;
EditText et_email;
EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// EditText et_name = findViewById(R.id.et_name);
// EditText et_pwd = findViewById(R.id.et_pwd);
public void register(View v) {
//要改变进度的progressBar对象要加final属性
final ProgressBar prg_horizontal = findViewById(R.id.prg_horizontal);
et_name = findViewById(R.id.et_name);
et_passWord = findViewById(R.id.et_passWord);
et_email = findViewById(R.id.et_email);
et_phone = findViewById(R.id.et_phone);
//使用逻辑运算符&&一个个排除,若有错,则输出出错位置的某种错误,不会继续往下判断,重复输出错误信息
if (checkEditRight(et_name) &&
checkEditRight(et_passWord) &&
checkEditRight(et_email) &&
checkEditRight(et_phone)
//判断无误后执行指定操作
) prgOK(prg_horizontal);
}
/**
* 获取输入框文本长度
*
* @param editText 输入框对象
* @return int 长度
*/
public int getEditLength(EditText editText) {
return editText.getText().toString().length();
}
/**
* 判断输入框是否为空(字符串)
*
* @param editText 输入框对象
* @return 为空为true 非空为false 并输出错误信息
*/
public boolean checkEditEmptyString(EditText editText) {
if (editText.getText().toString().equals("")) {
Toast.makeText(this, editText.getHint() + "为空", Toast.LENGTH_SHORT)
.show();//要使用show方法才能显示
return false;
}
return true;
}
/**
* 判断输入框文本长度是否大于等于输入框最小长度
*
* @param editText EditText对象
* @param minLength 输入框最小长度
* @return 大于等于为true 小于为false 并输出错误信息
*/
public boolean checkEditLength(int minLength, EditText editText) {
if (getEditLength(editText) < minLength) {
Toast.makeText(this, editText.getHint() + "最小长度为" +
minLength + "字符", Toast.LENGTH_SHORT)
.show();//要使用show方法才能显示
return false;
} else return true;
}
/**
* 判断输入框文本是否符合要求
*
* @param editText EditText对象
* @return 符合为true 不符合为false 并输出对应错误的错误信息
*/
public boolean checkEditRight(EditText editText) {
if ( checkEditEmptyString(editText) ) {
switch (editText.getId()) {
case R.id.et_name:
return checkEditLength(3, editText);
case R.id.et_passWord:
return checkEditLength(6, editText);
case R.id.et_email:
return checkEditLength(10, editText);
case R.id.et_phone:
return checkEditLength(11, editText);
}
}
return false;
}
/**
* 显示对应进度条,并加载
*
* @param progressBar ProgressBar对象
*/
public void prgOK(final ProgressBar progressBar) {
//设置控件隐藏显示属性 的 方法
progressBar.setVisibility(View.VISIBLE);
//用线程持续设置进度,从1到100
new Thread() {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
progressBar.setProgress(i);
try {
Thread.sleep((long) (30 + Math.random() * 100));//随机时间间隔
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//线程要start才能运行
}.start();
}
}
注:案例 资源 部分代码来自imooc课程