Job*_*nce 12 android android-layout
我从服务器获取可变大小的数据并设置为textView,我希望textview根据文本集的长度调整大小.
它在材料设计指南中给出.怎么去编码呢?

链接指南 - https://material.google.com/style/typography.html#typography-other-typographic-guidelines
Art*_*kii 14
现在有了这个问题的官方解决方案.使用Android O引入的TextViews自动调整功能可在支持库26中获得,并向后兼容到Android 4.0.
https://developer.android.com/preview/features/autosizing-textview.html
and*_*per 11
这是使用支持库的一种方法:
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:breakStrategy="balanced"
android:gravity="center_horizontal"
android:maxLines="1"
android:text="Hello world"
android:textSize="300sp"
app:autoSizeTextType="uniform"
tools:targetApi="o"/>
Run Code Online (Sandbox Code Playgroud)
这android:breakStrategy允许使文本很好地转到下一行,而不是可能会破坏单词的默认行为。
在gradle中,使用这个:
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'com.google.android.material:material:1.0.0-beta01'
Run Code Online (Sandbox Code Playgroud)
或这个:
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
Run Code Online (Sandbox Code Playgroud)
请注意,建议在 TextView(宽度和/或高度)上设置布局限制,以确保您正确使用。一切都取决于您的用例。
支持库的修订版 26.0.1 添加了对AppCompatTextView 中自动调整大小的支持。
开发人员现在可以让他们的文本大小根据 TextView 的大小和特性自动扩展或收缩,从而更容易优化不同屏幕或动态内容上的文本大小。
在 Java 中:
调用setAutoSizeTextTypeUniformWithConfiguration()方法:
setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)
Run Code Online (Sandbox Code Playgroud)
在 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" />
Run Code Online (Sandbox Code Playgroud)
在 Java 中:
调用setAutoSizeTextTypeUniformWithPresetSizes()方法:
setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit)
Run Code Online (Sandbox Code Playgroud)
在 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" />
Run Code Online (Sandbox Code Playgroud)
要将数组作为资源访问,请在 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>
Run Code Online (Sandbox Code Playgroud)
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) {
}
});
Run Code Online (Sandbox Code Playgroud)
更新:根据问题,您可以创建一个组件(自定义视图)并根据需要从 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) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
}
您必须在 xml 中使用它而不是通常的 textView
| 归档时间: |
|
| 查看次数: |
23277 次 |
| 最近记录: |