在Android的EditText中实现autoSizeTextType。

9 浏览
0 Comments

在Android的EditText中实现autoSizeTextType。

Android Oreo的buildToolsVersion提供了一种简化的方式来自动调整AppCompatTextView中的文本大小,如下所示:


类似的实现方式能否应用于AppCompatEditText,因为它基本上是TextView的一个扩展?简单地将autoSizeTextType应用于AppCompatEditText似乎不起作用。有没有办法使其工作?

0
0 Comments

问题原因:需要实现一个自动调整文本大小的功能,以适应单行的EditText控件。

解决方法:通过在TextWatcher中调用updateTextSize()函数来实现自动调整文本大小的功能。

代码如下:

private val initialTextSize: Float by lazy {

resources.getDimensionPixelSize(R.dimen.default_text_size).toFloat()

}

private fun updateTextSize(s: CharSequence) {

// Auto resizing text

val editWidth = myEditText.width

if (editWidth > 0) { // when the screen is opened, the width is zero

var textWidth = myEditText.paint.measureText(s, 0, s.length)

if (textWidth > editWidth) {

var fontSize = initialTextSize

while (textWidth > editWidth && fontSize > 12) { // minFontSize=12

fontSize -= 1

myEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)

textWidth = myEditText.paint.measureText(s, 0, s.length)

}

} else {

var fontSize = myEditText.textSize

while (textWidth <= editWidth && fontSize < initialTextSize) {

fontSize = min(fontSize + 1, initialTextSize)

myEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)

textWidth = myEditText.paint.measureText(s, 0, s.length)

}

}

}

}

private fun createTextWatcher() = object : SimpleTextWatcher() {

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

super.beforeTextChanged(s, start, count, after)

s?.let { updateTextSize(it) }

}

override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {

// Do nothing

}

override fun afterTextChanged(s: Editable?) {

super.afterTextChanged(s)

s?.let { updateTextSize(it) }

}

}

在CustomEditText中使用这个解决方案。

0
0 Comments

问题出现的原因是Android的EditText控件没有自动调整文本大小的功能。解决方法是使用第三方库来实现这个功能。其中一个推荐的库是AutoFitEditText,可以在以下链接找到该库的代码:https://github.com/ViksaaSkool/AutoFitEditText。另外,还可以在Stack Overflow上找到更多关于自适应文本大小的讨论:Auto-fit TextView for Android。作者还在他的博客上写了一篇关于使用这个库的文章:https://viksaaskool.wordpress.com/2014/11/16/using-auto-resize-to-fit-edittext-in-android/

0
0 Comments

No you cannot. Please see here; it is disabled for all AppCompatEditText since it is not supported.

link is broken.

上面的内容表明,Android中的AppCompatEditText不支持autoSizeTextType属性。根据提供的链接,该属性在AppCompatTextViewAutoSizeHelper.java文件的817行被禁用。

解决方法:

由于AppCompatEditText不支持autoSizeTextType属性,因此无法直接在EditText上使用该属性。要实现类似的自动调整文本大小的功能,可以考虑使用其他方式,如使用TextView或自定义EditText并编写相应的代码来实现。

以下是一个示例代码,演示如何在自定义EditText中实现自动调整文本大小的功能:

import android.content.Context;
import android.graphics.Rect;
import android.text.TextPaint;
import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatEditText;
public class AutoSizeEditText extends AppCompatEditText {
    private float defaultTextSize;
    public AutoSizeEditText(Context context) {
        super(context);
        init();
    }
    public AutoSizeEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public AutoSizeEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init() {
        defaultTextSize = getTextSize();
    }
    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        autoSizeText();
    }
    private void autoSizeText() {
        TextPaint textPaint = getPaint();
        Rect bounds = new Rect();
        textPaint.getTextBounds(getText().toString(), 0, getText().length(), bounds);
        float desiredTextSize = getTextSize() * getWidth() / bounds.width();
        setTextSize(desiredTextSize);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        autoSizeText();
    }
}

上述代码创建了一个名为AutoSizeEditText的自定义EditText,并覆盖了onTextChanged和onSizeChanged方法。在onTextChanged方法中,会自动调用autoSizeText方法来调整文本大小。在autoSizeText方法中,首先获取EditText的TextPaint和文本边界,然后根据EditText的宽度和文本边界的宽度计算出所需的文本大小,并将其设置为EditText的文本大小。

要在布局文件中使用AutoSizeEditText,只需将EditText替换为AutoSizeEditText即可:


使用上述代码和自定义EditText,可以实现类似于autoSizeTextType属性的自动调整文本大小功能。

0