Android 多个输入框的自动跳转

在Android的项目开发过程中,经常会遇到输入手机验证码的需求,常见的处理方式是设置一个输入框,提醒用户输入获取到的验证码,如下图所示:
在这里插入图片描述
这种类型的验证码就是对EditText控件做简单的处理即可,还有一种交互效果是另外一种样式,如下图所示:
在这里插入图片描述
这一种交互方式是通过多个输入框来实现的,并且实现了 输入框的自动跳转等效果,本文主要介绍的就是这种效果的实现方式,首先我们先来看一下最终实现的效果:
在这里插入图片描述
接下来我们具体来实现这一效果:

布局文件的编写:

 <?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"
    android:background="#fff"
    tools:context="com.cjxj.androiddemo.activity.InputActivity">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp">

        <EditText
            android:id="@+id/input_et_text1"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@drawable/activity_input_editbg_shape"
            android:gravity="center"
            android:inputType="number"
            android:lines="1"
            android:maxLength="1"
            android:textColor="#333"
            android:textSize="18sp" />

        <EditText
            android:id="@+id/input_et_text2"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="25dp"
            android:background="@drawable/activity_input_editbg_shape"
            android:gravity="center"
            android:inputType="number"
            android:lines="1"
            android:maxLength="1"
            android:textColor="#333"
            android:textSize="18sp" />

        <EditText
            android:id="@+id/input_et_text3"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="25dp"
            android:background="@drawable/activity_input_editbg_shape"
            android:gravity="center"
            android:inputType="number"
            android:lines="1"
            android:maxLength="1"
            android:textColor="#333"
            android:textSize="18sp" />

        <EditText
            android:id="@+id/input_et_text4"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="25dp"
            android:background="@drawable/activity_input_editbg_shape"
            android:gravity="center"
            android:inputType="number"
            android:lines="1"
            android:maxLength="1"
            android:textColor="#333"
            android:textSize="18sp" />

    </LinearLayout>


</RelativeLayout>

布局文件主要是实现了四个EditText输入框,通过inputType属性设置输入类型为数字类型,通过maxLength属性来设置输入框最大输入数量为1,通过上述代码即可实现我们演示中的布局效果。接下来就是处理这四个文本框的交互效果。

逻辑的处理

首先,我们通过演示的效果可以得出交互的逻辑:
1.输入框可以实现输入后自动跳转到下一个输入框
2.只有当前正在输入的输入框是可点击的,其他输入框皆不可点击,即始终只有一个输入框可点击和获取焦点
3.当用户点击键盘的删除键,文本框自动删除回退

public class InputActivity extends AppCompatActivity {
    private EditText et_text1, et_text2, et_text3, et_text4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input);

        initView();
    }

    private void initView() {
        et_text1 = findViewById(R.id.input_et_text1);
        et_text2 = findViewById(R.id.input_et_text2);
        et_text3 = findViewById(R.id.input_et_text3);
        et_text4 = findViewById(R.id.input_et_text4);
        et_text2.setEnabled(false);
        et_text3.setEnabled(false);
        et_text4.setEnabled(false);

        et_text1.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) {
                if (charSequence.length() > 0) {
                    et_text2.setEnabled(true);
                    et_text1.clearFocus();
                    et_text2.requestFocus();
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() > 0) {
                    et_text1.setEnabled(false);
                } else {
                    et_text1.setEnabled(true);
                    et_text2.setEnabled(false);
                }
            }
        });

        et_text2.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) {
                if (charSequence.length() > 0) {
                    et_text3.setEnabled(true);
                    et_text2.clearFocus();
                    et_text3.requestFocus();
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() > 0) {
                    et_text2.setEnabled(false);
                } else {
                    et_text2.setEnabled(true);
                    et_text3.setEnabled(false);
                }
            }
        });

        et_text3.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) {
                if (charSequence.length() > 0) {
                    et_text4.setEnabled(true);
                    et_text3.clearFocus();
                    et_text4.requestFocus();
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() > 0) {
                    et_text3.setEnabled(false);
                } else {
                    et_text3.setEnabled(true);
                    et_text4.setEnabled(false);
                }
            }
        });

        et_text4.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) {
                if (charSequence.length() > 0) {
                    Toast.makeText(InputActivity.this, "输入完成", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });

        et_text2.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if (i == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                    if (et_text2.getText().length() <=0) {
                        et_text1.setEnabled(true);
                        et_text1.requestFocus();
                        et_text2.clearFocus();
                        et_text1.setText("");
                    }
                }
                return false;
            }
        });

        et_text3.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if (i == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                    if (et_text3.getText().length() <=0) {
                        et_text2.setEnabled(true);
                        et_text2.requestFocus();
                        et_text3.clearFocus();
                        et_text2.setText("");
                    }
                }
                return false;
            }
        });

        et_text4.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if (i == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                    if (et_text4.getText().length() <=0) {
                        et_text3.setEnabled(true);
                        et_text3.requestFocus();
                        et_text4.clearFocus();
                        et_text3.setText("");
                    }
                }
                return false;
            }
        });
    }
}

逻辑代码主要有两部分:
1.addTextChangedListener方法的处理:
当用户操作输入数据时,设置下一个输入框可点击并获取焦点,输入结束之后,设置当前输入框不可点击。
同时,当用户执行删除操作,文本框内容为空时,设置当前文本框可点击并获得焦点,下一个文本框不可点击。
2.setOnKeyListener监听方法的处理:
setOnKeyListener方法中的:
i == KeyEvent.KEYCODE_DEL 用于监听软键盘的删除键。
keyEvent.getAction() == KeyEvent.ACTION_DOWN 用于处理,点击触发的重复问题,因为点击删除按钮会触发Down和UP事件。
至此,基本的逻辑基本实现,如有问题,欢迎指正。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基本的步骤: 1. 在 Android Studio 中创建一个新项目,选择 Empty Activity。 2. 在布局文件中添加一个 TextView 和两个 EditText,用来输入用户名和密码。 3. 在布局文件中添加一个 Button,用来触发登录操作。 4. 在 LoginActivity.java 中添加以下代码: ``` public class LoginActivity extends AppCompatActivity { private EditText mUsernameEditText; private EditText mPasswordEditText; private Button mLoginButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mUsernameEditText = findViewById(R.id.username_edit_text); mPasswordEditText = findViewById(R.id.password_edit_text); mLoginButton = findViewById(R.id.login_button); mLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String username = mUsernameEditText.getText().toString(); String password = mPasswordEditText.getText().toString(); if (username.equals("admin") && password.equals("password")) { // 登录成功,跳转到主界面 Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); finish(); } else { // 登录失败,显示错误信息 Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show(); } } }); } } ``` 5. 在 MainActivity.java 中添加以下代码: ``` public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ``` 6. 运行应用程序,输入正确的用户名和密码,点击登录按钮,应该能够跳转到主界面。 以上就是一个基本的登录跳转界面的步骤。当然,还有很多细节需要注意,比如输入框的验证、布局的优化等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值