web-dev-qa-db-fra.com

Autosizing EditText

Android a récemment ajouté la prise en charge du redimensionnement de la taille du texte TextViews en fonction de la taille de la vue et des tailles de texte minimale et maximale.
https://developer.Android.com/guide/topics/ui/look-and-feel/autosizing-textview.html

Malheureusement, ils ne supportent pas EditTexts, alors Y a-t-il d'autres alternatives pour EditText?

8
Ahmed Hegazy

J'étais coincé comme vous, comment EditText est l'enfant de TextView mais ne supporte pas l'autosize ¿? ¿?

J'ai réalisé cela avec une sorte de bidouille . J'ai tout d'abord vu le code TextView à copier et à implémenter en tant qu'extension (dans Kotlin) sur EditTextView, mais .. il y a un ensemble de méthodes, donc je supprime finalement cette option.

Ce que j’ai fait, c’est d’utiliser un TextView invisible (oui, je sais, c’est un piratage complet, je ne suis pas très content, mais Google devrait en avoir honte).

C'est mon xmls

    <TextView Android:id="@+id/invisibleTextView"
    Android:layout_height="0dp"
    Android:layout_width="match_parent"
    Android:focusable="false"
    app:autoSizeTextType="uniform"
    app:autoSizeMinTextSize="@dimen/text_min"
    app:autoSizeMaxTextSize="@dimen/text_max"
    app:autoSizeStepGranularity="@dimen/text_step"
    Android:textAlignment="center"
    app:layout_constraintLeft_toLeftOf="@id/main"
    app:layout_constraintRight_toRightOf="@id/main"
    app:layout_constraintTop_toBottomOf="@id/textCount"
    app:layout_constraintBottom_toBottomOf="@id/main"
    Android:visibility="invisible"
    tool:text="This is a Resizable Textview" />


<EditText Android:id="@+id/resizableEditText"
    Android:layout_height="0dp"
    Android:layout_width="match_parent"
    Android:textAlignment="center"
    app:layout_constraintLeft_toLeftOf="@id/main"
    app:layout_constraintRight_toRightOf="@id/main"
    app:layout_constraintTop_toBottomOf="@id/textCount"
    app:layout_constraintBottom_toBottomOf="@id/main"
    Android:maxLength="@integer/max_text_length"
    tool:text="This is a Resizable EditTextView" />

Note: Il est important que les deux vues aient la même largeur/hauteur

Ensuite, dans mon code, j'utilise les calculs automatiques de cette vue de texte à utiliser avec ma commande EditTextView.

private fun setupAutoresize() {
    invisibleTextView.setText("a", TextView.BufferType.EDITABLE) //calculate the right size for one character
    resizableEditText.textSize = autosizeText(invisibleTextView.textSize)
    resizableEditText.setHint(R.string.text_hint)

    resizableEditText.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            resizableEditText.textSize = autosizeText(invisibleTextView.textSize)
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            textCount.text = currentCharacters.toString()
            val text = if (s?.isEmpty() ?: true) getString(R.string.text_hint) else s.toString()
            invisibleTextView.setText(text, TextView.BufferType.EDITABLE)
        }
    })
}

private fun autosizeText(size: Float): Float {
    return size / (resources.displayMetrics.density + MARGIN_FACTOR /*0.2f*/)
}

Comme note, pour changer la taille de l'indice j'utilise ceci Android EditText Hint Size .

Je sais que la solution de contournement est difficile, mais au moins nous sommes certains que cela continuera de fonctionner même si les modifications apportées à la taille de la carte sont redimensionnables sur les versions futures, alors qu'une librairie propétaire ou abandonnée échouera.

J'espère qu'un jour, Google nous entendra et mettra en œuvre cette fonctionnalité merveilleuse sur les enfants, et nous pourrions éviter tout cela

J'espère que cela t'aides

2
Sulfkain

Cette bibliothèque est basée sur:

AutoFitTextView https://github.com/ViksaaSkool/AutoFitEditText Essayez celui-ci 

1
Libin Thomas