如何给更多的EditText字段一种单行的感觉

Posted

技术标签:

【中文标题】如何给更多的EditText字段一种单行的感觉【英文标题】:How to give more EditText fields a one line feeling 【发布时间】:2020-05-18 17:08:32 【问题描述】:

我的代码中有 4 个编辑文本字段,用户必须在其中插入 4 个数字。我想让 4 个字段相互连接,就像一个文本字段一样。意思是,如果我输入了第一个数字,它应该直接跳转到第二个编辑文本,依此类推。删除它应该从 4 回到 1,而无需用户选择每个字段并删除插入的值

我该如何管理?

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


        <EditText
            android:id="@+id/numberone"
            android:layout_
            android:layout_
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/numbertwo"
            />


        <EditText
            android:id="@+id/numbertwo"
            android:layout_
            android:layout_
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/numberthree"
            />


        <EditText
            android:id="@+id/numberthree"
            android:layout_
            android:layout_
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/numberfour"
            />


        <EditText
            android:id="@+id/numberfour"
            android:layout_
            android:layout_
            android:inputType="number"
            android:maxLength="1"
            android:nextFocusDown="@id/btn_confirmcode"
            />


    </androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

请注意,有许多现有的 OTP 样式小部件。 android-arsenal.com/search?q=otp 列出了一堆(不幸的是,还有其他在描述中碰巧有“otp”的库......)。 【参考方案1】:

好吧,我会捕捉每个编辑文本的输入事件,并检查用户是否删除或插入了某些文本。之后,您可以告诉程序获取下一个/上一个编辑文本等的焦点。例如;

 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()
       
   

【讨论】:

【参考方案2】:

我把这个留给有同样问题的人:

 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) 

                            
                        )
                    

【讨论】:

以上是关于如何给更多的EditText字段一种单行的感觉的主要内容,如果未能解决你的问题,请参考以下文章

将edittext限制为单行

android - 如何将 int 转换为字符串并将其放在 EditText 中?

如何设置Edittext到Actionbar?

王立平--EditText实现单行显示,左側图标,提示信息

如何更改各种微调器值的 EditText 字段

EditText - 如何检测输入 3 个或更多字符并执行搜索