Как придать больше полей EditText в одной строке - PullRequest
0 голосов
/ 03 февраля 2020

В моем коде 4 поля для редактирования текста, в которые пользователь должен вставить 4 цифры. Мне бы хотелось, чтобы 4 поля были связаны друг с другом, как это было бы для одного текстового поля. Это означает, что если я ввел первый di git, он должен перейти непосредственно ко второму тексту редактирования и так далее. Удаление должно go вернуться с 4 на 1, без необходимости пользователя выбирать каждое поле и удалять вставленное значение

Как мне это сделать?

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/number_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >


        <EditText
            android:id="@+id/numberone"
            android:layout_width="@dimen/edit_text"
            android:layout_height="@dimen/edit_text_h"
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/numbertwo"
            />


        <EditText
            android:id="@+id/numbertwo"
            android:layout_width="@dimen/edit_text"
            android:layout_height="@dimen/edit_text_h"
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/numberthree"
            />


        <EditText
            android:id="@+id/numberthree"
            android:layout_width="@dimen/edit_text"
            android:layout_height="@dimen/edit_text_h"
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/numberfour"
            />


        <EditText
            android:id="@+id/numberfour"
            android:layout_width="@dimen/safe_edit_text"
            android:layout_height="@dimen/safe_edit_text_h"
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/btn_confirmcode"
            />


    </androidx.constraintlayout.widget.ConstraintLayout>

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Я оставляю это здесь для любого с той же проблемой:

 for(i in 1..4) {
                        val layoutID = this.resources
                                .getIdentifier("editText$i","id",this.activity!!.packageName)
                        val currentEditText = view.findViewById<EditText>(layoutID)

                        currentEditText.addTextChangedListener(object:TextWatcher{

                            override fun afterTextChanged(p0: Editable?) {
                                Log.e("p0?.length",p0?.length.toString())
                                if (p0?.length!! > 0) {
                                    //change focus to the next edittext
                                    if(i in 1..3){
                                        val layoutIDnext = this.resources
                                                .getIdentifier("editText"+(i+1),
                                                        "id",
                                                        this.activity!!.packageName)
                                        val nextEditText = view.findViewById<EditText>(layoutIDnext)
                                        nextEditText.requestFocus()
                                    }

                                } else if (p0?.length == 0) {
                                    //change focus to the previous edit text

                                    if(i in 2..4) {
                                        val layoutIdbefore = this.resources.getIdentifier("editText"+(i-1),
                                                "id",
                                                this.activity!!.packageName)
                                        val lastEditText = view.findViewById<EditText>(layoutIdbefore)
                                        lastEditText.requestFocus()

                                        currentEditText.setOnKeyListener { _, _, keyEvent ->
                                            if(keyEvent.keyeditText == KeyEvent.KEYeditText_DEL) {
                                                lastEditText.requestFocus()
                                            }
                                            return@setOnKeyListener false
                                        }

                                    }

                                }}

                            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                                }

                            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {

                            }
                        })
                    }
1 голос
/ 03 февраля 2020

Ну, я бы поймал событие ввода для каждого текста редактирования и проверил, удалил ли пользователь какой-либо текст или вставил его. После этого вы можете указать программе получить фокус следующего / предыдущего текста редактирования и так далее. Например;

 binding.editText2.doAfterTextChanged { 
       if (it?.length!! > 0) {
           //change focus to the next edittext
           binding.editText3.requestFocus()
       } else if (it?.length == 0) {
           //change focus to the previous edit text
           binding.editText1.requestFocus()
       }
   }
...