移动到Pin屏幕中的下一个edittext

时间:2014-07-25 07:18:58

标签: android android-edittext

我知道问题已被多次询问,但他们的解决方案都没有对我有用。可能是我犯了一些错误。我想转移到下一个EditText我已完成输入。它是一个带有四个edittexts的引脚屏幕。 我希望我们能够通过在布局xml中放置一些代码来实现它。

以下是我的代码的一部分 - `         

    <EditText
        android:id="@+id/num2"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginRight="7dp"
        android:background="@drawable/outline"
        android:inputType="numberPassword"
        android:maxLength="1"
        android:maxLines="1"
        android:imeOptions="actionNext"
        android:singleLine="true" />
    <!-- android:nextFocusForward="@+id/num3" -->

    <EditText
        android:id="@+id/num3"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginRight="7dp"
        android:background="@drawable/outline"
        android:inputType="numberPassword"
        android:maxLength="1"
        android:maxLines="1"
        android:singleLine="true" />
    <!-- android:nextFocusForward="@+id/num4" -->

    <EditText
        android:id="@+id/num4"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginRight="7dp"
        android:background="@drawable/outline"
        android:imeActionId="@+id/submit"
        android:imeActionLabel="Log In"
        android:imeOptions="actionDone"
        android:inputType="numberPassword"
        android:maxLength="1"
        android:maxLines="1"
        android:singleLine="true" />
    <!-- android:nextFocusForward="@+id/submit" -->

`

2 个答案:

答案 0 :(得分:0)

您可以检查为1st EditText按下的键,如果是“Enter”键,则将焦点移至下一个EditText。

et1.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
    if(keyCode == 66) {
        et2.requestFocus();
    }
    return false;
}
});

或者你也可以通过Text Watcher来实现它,你可以通过使用Text Watcher类来实现这一点,然后将焦点设置在TextWatcher的OnTextChanged()方法中的下一个EditText上。

et1.addTextChangedListener(new TextWatcher() {

public void onTextChanged(CharSequence s, int start,int before, int count) 
{
    // TODO Auto-generated method stub
    if(et1.getText().toString().length()==size)     //size as per your requirement
    {
        et2.requestFocus();
    }
}
public void beforeTextChanged(CharSequence s, int start,
                int count, int after) {
            // TODO Auto-generated method stub

}

public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
}

});

答案 1 :(得分:0)

尝试一下:

override fun afterTextChanged(s: Editable) {

    (0 until editTextArray.size)
        .forEach { i ->
            if (s === editTextArray[i].editableText) {

                if (s.isBlank()) {
                    return
                }
                if (s.length >= 2) {//if more than 1 char
                    val newTemp = s.toString().substring(s.length - 1, s.length)
                    if (newTemp != numTemp) {
                        editTextArray[i].setText(newTemp)
                    } else {
                        editTextArray[i].setText(s.toString().substring(0, s.length - 1))
                    }
                } else if (i != editTextArray.size - 1) { //1 char
                    editTextArray[i + 1].requestFocus()
                    editTextArray[i + 1].setSelection(editTextArray[i + 1].length())
                    return
                } else

                //will verify code the moment the last character is inserted and all digits have a number
                    verifyCode(testCodeValidity())


            }
        }
}

并添加onKeyListener来处理退格键:

editTextArray[index].setOnKeyListener { _, keyCode, event ->
    if (keyCode == KeyEvent.KEYCODE_DEL && event.action == KeyEvent.ACTION_DOWN) {
        //backspace
        if (index != 0) { //Don't implement for first digit
            editTextArray[index - 1].requestFocus()
            editTextArray[index - 1]
                 .setSelection(editTextArray[index - 1].length())
        }
    }
    false
}

摘自本教程:https://medium.com/@Lev_Sharone/create-your-own-customized-pin-code-layout-in-3-simple-steps-e36d560689f8