2020.06.13 Android学习日志 注册功能部分实现

先上代码

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>

MuMu20200613233052.png

实现功能:

按下按钮 从第一个输入框往下判断
是否为空
是否小于指定的最小长度
若有错误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课程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值