Android EditText obtenir/perdre le focus

Parmi les exigences du projet, il existe une autre interface de code de vérification à chiffres 4. Le jeune frère est ignorant et n'a pensé qu'à mettre quatre EditTexts dans une disposition linéaire .

Une fois que le contenu doit être entré, il passera automatiquement à la position suivante pour se concentrer. Après avoir supprimé la position spécifiée, il passera automatiquement à la position précédente pour se concentrer. Étant donné que l'interface utilisateur ciblée/non ciblée est affichée différemment, chaque editText réglera fréquemment la mise au point à changer.

Auparavant, comme c'était le clavier système qui était appelé, il était très pratique de lier editText et le clavier. Cependant, nous devions personnaliser un clavier numérique affiché sur l'interface utilisateur, il y avait donc quelques bogues.

Le bogue n'est pas difficile, mais il est un peu désordonné. Voici ma solution. Résumez-le et souvenez-vous-en plus clairement à l'avenir !

1. Tout d'abord, une fois le contenu d'entrée réalisé, il passera automatiquement à la position suivante pour se concentrer :

Méthode de mise en œuvre : une fois que TextWatcher surveille l'entrée de contenu, définissez cette position pour perdre le focus et la position suivante pour obtenir le focus (contrôler ainsi les modifications de l'interface utilisateur)

var textWatcher: TextWatcher = object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
        override fun afterTextChanged(s: Editable) {
            if (!s.toString().isEmpty() && currentPosition < editTextList.size() - 1) {
                editTextList.get(currentPosition).setFocusable(false)
                //下个位置自动聚焦
                currentPosition++
                editTextList.get(currentPosition).setFocusable(true)
                editTextList.get(currentPosition).setFocusableInTouchMode(true)
                editTextList.get(currentPosition).requestFocus()
                editTextList.get(currentPosition).findFocus()
            }
        }
    }

Conseils : je n'ai appelé que requestFocus() auparavant, mais il y a une probabilité que cela échoue, car j'appellerai setFocusable(false) pendant l'opération, donc le moyen le plus sûr est :

editTextList.get(currentPosition).setFocusable(true);//Définir la zone de saisie pour qu'elle soit focalisable
editTextList.get(currentPosition).setFocusableInTouchMode(true);//Définir la mise au point tactile
editTextList.get(currentPosition).requestFocus();//Demander le focus
editTextList.get(currentPosition).findFocus();//obtenir le focus

2. Après avoir supprimé le contenu, configurez-le pour perdre le focus, passez à la position avec le contenu et obtenez le focus

fun deleteContent() {
        editTextList.get(currentPosition).setText("")
        if (currentPosition > 0) {
            editTextList.get(currentPosition).setFocusable(false)
            editTextList.get(currentPosition)
                .setBackground(ContextCompat.getDrawable(context, R.drawable.rgb_282730_r12))
            //跳到前一个不为空的EditText
            for (position in currentPosition downTo 0) {
                currentPosition = position
                if (!editTextList.get(position).getText().toString().isEmpty()) {
                    isDelete = true
                    editTextList.get(currentPosition).setBackground(
                        ContextCompat.getDrawable(
                            context,
                            R.drawable.rgb272830_stroke_r12
                        )
                    )
                    editTextList.get(currentPosition).setFocusable(true)
                    editTextList.get(currentPosition).setFocusableInTouchMode(true)
                    editTextList.get(currentPosition).requestFocus()
                    editTextList.get(currentPosition).findFocus()
                    break
                }
            }
        }
    }

 3. Il s'agit de la surveillance du focus : définissez l'arrière-plan de la liste editText en fonction de isFocused

var onFocusChangeListener =
        OnFocusChangeListener { v: View?, hasFocus: Boolean ->
            for (i in editTextList.indices) {
                if (editTextList.get(i).isFocused()) { 
                    currentPosition = ieditTextList.get(i).setBackground()
                } else { editTextList.get(i).setBackground() }
            }
        }

conseils:

1. Il est interdit à Edittext d'afficher le clavier logiciel (utilisez editText.setFocusable(false); cette méthode a été utilisée pour réaliser le saut de clic, mais cette fois, vous devez entrer du contenu et vous n'êtes pas autorisé à sortir du clavier, utilisez donc la méthode suivante) editText.setInputType(InputType
. TYPE_NULL); pour désactiver le clavier logiciel du téléphone mobile. (La définition de inputType sur none dans xml n'est pas valide)

2.editText.setInputType(InputType.TYPE_CLASS_TEXT); pour ouvrir le clavier logiciel.

おすすめ

転載: blog.csdn.net/LoveFHM/article/details/130555190