美文网首页
【Android开发】PIN解锁|EditText入门

【Android开发】PIN解锁|EditText入门

作者: 榆野铃爱 | 来源:发表于2019-09-26 15:28 被阅读0次

    心得感悟
    这个Demo的确不难,但让自己写还是不能写出来。因为之前没有学过Android开发的一些方法控件,每次布置的Demo都写不出来,还是挺挫败的。而且因为开学事情有点多,预习任务也没能好好完成,心里有点浮躁,感觉自己落后了很多。希望接下来自己可以静下心跟上进度吧。


    内容简概

    • 一、 EditText入门
    • 二、PIN解锁
    • 三、效果预览

    具体内容

    一、 EditText入门

    1.常用属性介绍

    EditText(输入框)是一个常用的控件,和TextView的区别在于可以接收用户输入。其常用属性如下:

    属性 作用
    android:paddingLeft="" 子控件(输入)边距
    android:textColor="" 输入文本的颜色
    android:textSize="" 输入文本的大小
    android:hint="" 提示文本
    android:textColorHint="" 提示文本的颜色
    android:maxLines="" 输入的最大行数
    android:inputType="" 输入内容的类型
    android:maxLength="" 输入的最大字符数
    android:cursorVisible="" 设置光标是否可见
    android:imeOptions="" 设置右下角的按键类型
    2.简单例子

    下面我们用以上属性做一个简单的界面

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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"
        tools:context=".MainActivity">
        
        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@drawable/bg"
    
            android:layout_marginLeft="50dp"
            android:layout_marginRight="50dp"
            android:paddingLeft="70dp"
    
            android:textColor="#ffffff"
            android:textSize="30sp"
    
            android:hint="请输入密码"
            android:textColorHint="#999999"
    
            android:maxLines="1"
            android:inputType="textPassword"
            android:maxLength="6"
    
            android:cursorVisible="false"
            android:imeOptions="actionGo"
            />
    </RelativeLayout>
    
    public class MainActivity extends AppCompatActivity implements TextView.OnEditorActionListener {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 通过id获取xml里对应的控件
            EditText et = findViewById(R.id.et_password);
    
            // 当前这个activity来监听事件
            et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                    et.getText();
                    return false;
                }
            });
            et.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int start, int before, int count) {
                }
                 /**
                 * CharSequence:显示的文本内容
                 * int start(i):0
                 * int before(i2):改变前字符数
                 * int count(i3):改变后字符数
                 *
                 * 限制输入个数为3个
                 */
                @Override
                public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
                    // 获取目前输入的个数
                    int len = charSequence.toString().length();
    
                    if (len > 6){
                        // 将最后一个删除
                        // 只要前面6 个
                        et.setText(charSequence.subSequence(1,6));
                        // 让光标定位到最后
                        et.setSelection(6);
                    }
                }
                @Override
                public void afterTextChanged(Editable editable) {
                }
            });
        }
        // 监听键盘被按下的回调事件
        @Override
        public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
             System.out.println("点击了");
             return false;
        }
    }
    

    由于密码保护,无法录制动态效果图,所以采用截图。
    (1)没输入文本前:输入框有提示文本:“请输入密码”,光标被隐藏。
    (2)输入任意文本后:提示消失,密码短暂时间显示内容,然后隐藏(变成圆点)。
    (3)继续输入文本:最多只能输入6个字符。



    这只是一个简单的例子,下面做一个更高阶一点的应用。

    二、PIN解锁

    1.主界面的xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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"
        tools:context=".MainActivity">
    
        <!--添加背景图片-->
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/main_bg" />
        
        <!--文本提示框-->
        <TextView
            android:id="@+id/tv_alert"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="请设置密码"
            android:textSize="@dimen/dimen_alert"
            android:textColor="@color/colorGrey"
            android:textAlignment="center"
            android:layout_marginTop="80dp"/>
    
        <!--添加文本输入框-->
        <EditText
            android:id="@+id/et_password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/bg"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/tv_alert"
            android:layout_marginTop="30dp"
            android:paddingLeft="70dp"
            android:textColor="@color/colorGrey"
            android:textSize="@dimen/dimen_textView"
            android:inputType="textPassword"
            android:maxLength="6"
            android:maxLines="1"
            android:cursorVisible="false"
            android:letterSpacing="0.5" />
    
    </RelativeLayout>
    
    2.主界面Java代码
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.res.Resources;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        private TextView mTextView;
        private EditText mEditText;
        private String password;
        private String firstInput;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 获取xml的控件
            mTextView = findViewById(R.id.tv_alert);
            mEditText = findViewById(R.id.et_password);
    
            // 获取保存的密码
            // 获取管理资源对象Resources
            Resources res = getResources();
            // 通过这个对象获取String.xml里面对应的字符串
            String fileName = res.getString(R.string.password_file_name);
            // 获取共享的sp对象:1.文件不存在就创建 2.文件存在就打开
            final SharedPreferences sp = getSharedPreferences(fileName,MODE_PRIVATE);
            // 通过key获取对应的value
            password = sp.getString("pwd",null);
    
            // 显示提示文本
            if (password == null){
                mTextView.setText("请设置密码");
            }else {
                mTextView.setText("请输入密码");
            }
    
            // 监听内容改变的事件
            mEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }
    
                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }
    
                @Override
                public void afterTextChanged(Editable editable) {
                    // 获取文本内容
                    String inputPassword = editable.toString();
    
                    // 判断是不是6个
                    if (inputPassword.length() == 6){
                        // 判断是不是设置密码
                        if (password == null){
                            // 设置密码
                            if (firstInput == null){
                                // 设置密码的第一次输入
                                firstInput = inputPassword;
    
                                // 提示确认密码
                                mTextView.setText("请确认密码");
    
                                // 清空
                                mEditText.setText("");
                            }else {
                                // 确认密码
                                if (firstInput.equals(inputPassword)){
                                    // 两次密码一致
                                    mTextView.setText("设置密码成功");
                                    // 保存密码
                                    SharedPreferences.Editor edit = sp.edit();
                                    edit.putString("pwd",firstInput);
                                    edit.commit();
                                    // 跳转
                                    goToNext();
                                }else {
                                    // 密码不正确
                                    mTextView.setText("两次密码不一致 请重新设置");
                                    firstInput = null;
                                    mEditText.setText("");
                                }
                            }
                        }else{
                            // 密码设置过了
                            if (inputPassword.equals(password)){
                                // 密码正确
                                mTextView.setText("密码正确!");
                                // 跳转
                                goToNext();
                            }else {
                                // 不正确
                                mTextView.setText("密码错误请重新输入");
                                // 清空
                                mEditText.setText("");
                            }
                        }
                    }
                }
            });
        }
    
        /**
         * 跳转到下一个界面
         * 四大组件
         * 1.activity 界面
         * 2.service 服务 后台做的事
         * 3.contentProvider 内容提供者 不同程序间数据交互
         * 4.broadcastReceiver 广播接收者  (通知)
         *
         * Intent 作为数据传递
         * Intent:意图 (跳到哪个界面,要不要带数据)
         */
        private void goToNext(){
            // 创建一个Intent确定跳转的界面
            // 1.显示意图 2.隐示意图 (系统界面)
            Intent intent = new Intent(this,SecondActivity.class);
    
            // 跳转
            startActivity(intent);
        }
    }
    
    3.跳转页面的xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".SecondActivity"
        android:background="@drawable/pic">
        
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    4.跳转页面的Java代码
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.MotionEvent;
    
    public class SecondActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // 返回上一个界面(删除当前界面)
            // 结束当前的activity
            finish();
            return true;
        }
    }
    
    5.添加跳转页面

    找到value,鼠标右击,按图中顺序操作完成创建。


    6.添加自定义控件strings

    同样找到value,鼠标右击,按图中顺序操作完成创建。


    三、效果预览

    由于密码的保护机制,输入密码时录屏软件无法正常录制,只能放一个结尾的动图以及各部分截图。


    密码正确,跳转至另一个页面

    顺序:第一次设置密码→两次输入不一致→设置密码成功→第二次登陆输入密码错误→输入密码正确


    第一次设置密码
    密码不一致→设置成功
    第二次登陆密码输入错误
    第二次登陆密码输入正确→跳转至另一个页面

    相关文章

      网友评论

          本文标题:【Android开发】PIN解锁|EditText入门

          本文链接:https://www.haomeiwen.com/subject/ufqyyctx.html