如何根据android中文本的长度动态自动调整textview的大小?

时间:2016-06-13 11:58:22

标签: android android-layout

我从服务器获取可变大小的数据并设置为textView,我希望textview根据文本集的长度调整大小。

材料设计指南中给出了这一点。怎么去编码呢?

Material Design Guidelines

链接指南 - https://material.google.com/style/typography.html#typography-other-typographic-guidelines

7 个答案:

答案 0 :(得分:11)

现在有了这个问题的官方解决方案。使用Android O自动调整TextViews可在支持库26中使用,并向后兼容到Android 4.0。

https://developer.android.com/preview/features/autosizing-textview.html

答案 1 :(得分:4)

addTextChangedListener是Edit Tex的监听器。 这个监听器监视editText的变化,它有三种不同的状态。

EditText edt = someEditText;
edt.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        /*watch the editText on every input and changes, then mange the size by if statements and editText length*/
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (edt.getText().toString().length() > 10){
                edt.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeSmall);
            }
            else if (edt.getText().toString().length() > 5){
                edt.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeMedium);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

更新:根据问题,您可以创建一个组件(自定义视图) 并根据需要从AppCompatTextView名称扩展它; 在初始化中,您可以添加以下代码:

public class CustomTextView extends AppCompatTextView {
Context ctx;

public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    ctx = context;
    init();
}

public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    ctx = context;
    init();
}

public CustomTextView(Context context) {
    super(context);
    ctx = context;
    init();
}

public void init() {
    setOnTouchListener(null);
    addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (getText().toString().length() > 10){
                setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeSmall);
            }
            else if (getText().toString().length() > 5){
                setTextSize(TypedValue.COMPLEX_UNIT_SP, textSizeMedium);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

}

你必须在xml而不是通常的textView

中使用它

答案 2 :(得分:2)

这是使用支持库的一种方法:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:autoSizeTextType="uniform"
        android:breakStrategy="balanced" 
        android:gravity="center_horizontal"
        android:maxLines="1"
        android:text="Hello world" 
        android:textSize="300sp" 
        app:autoSizeTextType="uniform"
        tools:targetApi="o"/>

android:breakStrategy可以使文本很好地转到下一行,而不是默认的行为(可能会破坏单词)。

在gradle中,使用此:

implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'com.google.android.material:material:1.0.0-beta01'

或者这个:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'

请注意,建议对TextView设置布局限制(宽度和/或高度),以确保正确使用。一切都取决于您的用例。

答案 3 :(得分:1)

也许你可以尝试这样的事情:

EditText et = someEditText;
String text = et.getText().toString();
int textLength = text.length();

if (textLength > 25) {
    et.setTextSize(toSomeNumber as the size of the text);
} else if (textLength > 15) {
     et.setTextSize(toSomeNumber bigger than the previous);
} else {
      et.setTextSize(toSomeNumber this is the biggest);
}

更新: 如果你想以更多的方式解决你的问题,你可以参考这个问题。 How to set text size of textview dynamically for different screens

这是我用于自己的代码。我们接受任何建议来增强我的代码。希望它有所帮助。

答案 4 :(得分:0)

使用以下图书馆,非常适合您的需求。

根据doc:TextView自动调整文本大小以完全适合其范围。

链接:Android autofit textview

答案 5 :(得分:0)

支持库的修订版26.0.1在AppCompatTextView中添加了对自动调整大小的支持。

开发人员现在可以根据TextView的大小和特征自动扩展或收缩文本大小,从而更轻松地在不同屏幕或动态内容上优化文本大小。

粒度

在Java中:

调用setAutoSizeTextTypeUniformWithConfiguration()方法:

setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)

在XML中:

使用autoSizeMinTextSize,autoSizeMaxTextSize和autoSizeStepGranularity属性在布局XML文件中设置自动调整大小的维度:

<android.support.v7.widget.AppCompatTextView
        android:id=”@+id/autosizing_textview_presetsize” 
        android:layout_width=”wrap_content” 
        android:layout_height=”250dp” 
        android:layout_marginLeft=”0dp” 
        android:layout_marginTop=”0dp” 
        app:autoSizeMaxTextSize=”100sp” 
        app:autoSizeMinTextSize=”12sp” 
        app:autoSizeStepGranularity=”2sp” 
        app:autoSizeText=”uniform” 
        android:text=”Hello World!” 
        android:textSize=”100sp” 
        app:layout_constraintLeft_toLeftOf=”parent” 
        app:layout_constraintTop_toTopOf=”parent” />

预设尺寸

在Java中:

调用setAutoSizeTextTypeUniformWithPresetSizes()方法:

setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit)

在XML中:

在布局XML文件中使用autoSizePresetSizes属性:

<android.support.v7.widget.AppCompatTextView 
        android:id=”@+id/autosizing_textview_presetsize” 
        android:layout_width=”wrap_content” 
        android:layout_height=”250dp” 
        android:layout_marginLeft=”0dp” 
        android:layout_marginTop=”0dp” 
        app:autoSizeText=”uniform” 
        app:autoSizePresetSizes=”@array/autosize_text_sizes” 
        android:text=”Hello World!” 
        android:textSize=”100sp” 
        app:layout_constraintLeft_toLeftOf=”parent” 
        app:layout_constraintTop_toTopOf=”parent” />

要将数组作为资源访问,请在res / values / arrays.xml文件中定义数组:

<array name=”autosize_text_sizes”>
    <item>10sp</item>
    <item>12sp</item>
    <item>20sp</item>
    <item>40sp</item>
    <item>100sp</item>
</array>

答案 6 :(得分:0)

请记住,这确实会破坏可访问性。例如,如果用户决定通过电话设置更改字体大小,因为他根本看不清字体,那么将高度设置为DP的自动调整大小的文本视图不会受到影响。

为了解决此问题,您应该将android:layout_height与SP一起使用,以便在更改辅助功能设置时也可以缩放它。