TextView 中的 Spannable 文本显示不正确
Spannable text in TextView not showing properly
我的这段代码运行良好,但是当将构建工具和库从 26.0.2 更新到 27.0.3 时,TextView 开始剪切文本。一个 LinearLayout 中有 4 个 TextView。每个 TextView 的宽度为 0dp,权重为 1。所有 TextView 都有一个 4 个字母的单词,因此它们应该显示相同,但是构建工具更新破坏了它。
String s = "ssss";
float textBigger = 1.5f;
SpannableString ss1 = new SpannableString(s);
int index = 2;
ss1.setSpan(new RelativeSizeSpan(textBigger), 0, index, 0); // set size
ss1.setSpan(new ForegroundColorSpan(biggerTextColor), 0, index, 0);// set color
textView.setText(ss1, TextView.BufferType.SPANNABLE);
它应该是什么样子:
现在的样子:
从 26.0.2 更新的库:
compile 'com.android.support:appcompat-v7:27.0.2'
compile 'com.android.support:design:27.0.2'
compile 'com.android.support:cardview-v7:27.0.2'
compile 'com.android.support:support-v4:27.0.2'
编辑:
经过更多调试后,我将 gradle 改回如下:
compileSdkVersion 27
buildToolsVersion = '27.0.3'
targetSdkVersion 23
compile 'com.android.support:appcompat-v7:26.0.2'
现在只要把targetSdkVersion改成27,问题就来了。可跨越的事情与它无关。 TextViews 中的文本表现不同。甚至在 AndroidStudio xml 预览中显示 targetSdkVersion 设置为 27 时文本被剪切。
要对其进行测试,请使用上面的 gradle 设置创建一个项目。以及下面的 MainActivity 布局。将 targetSdkVersion 从 23 更改为 27,您应该会看到问题。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.ziadalhalabi.testspannable.MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Amin"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Bmin"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Cmaj"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Dmin"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Gmaj"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="C#min"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="F#min"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
好的,我能够重现问题。 appcompat-v7
中完全有可能存在潜在错误。但是,您可以通过简化布局来解决此问题。在所有 TextView
小部件上用简单的 android:layout_width="wrap_content"
替换 android:layout_width="0dp"
和 android:layout_weight="1"
的组合:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Amin"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Bmin"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Cmaj"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Dmin"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Gmaj"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="C#min"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="F#min"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
那,compileSdkVersion
和 targetSdkVersion
都设置为 27,并使用 appcompat-v7
的 27.0.2
,在 Nexus 5X 上给你这个 运行 Android8.1:
使用您最初的方法,似乎发生的事情是 Android 试图 word-wrap 这些行,但由于您将 maxLines
设置为 1
,它最终截断了这些行。
我的这段代码运行良好,但是当将构建工具和库从 26.0.2 更新到 27.0.3 时,TextView 开始剪切文本。一个 LinearLayout 中有 4 个 TextView。每个 TextView 的宽度为 0dp,权重为 1。所有 TextView 都有一个 4 个字母的单词,因此它们应该显示相同,但是构建工具更新破坏了它。
String s = "ssss";
float textBigger = 1.5f;
SpannableString ss1 = new SpannableString(s);
int index = 2;
ss1.setSpan(new RelativeSizeSpan(textBigger), 0, index, 0); // set size
ss1.setSpan(new ForegroundColorSpan(biggerTextColor), 0, index, 0);// set color
textView.setText(ss1, TextView.BufferType.SPANNABLE);
它应该是什么样子:
现在的样子:
从 26.0.2 更新的库:
compile 'com.android.support:appcompat-v7:27.0.2'
compile 'com.android.support:design:27.0.2'
compile 'com.android.support:cardview-v7:27.0.2'
compile 'com.android.support:support-v4:27.0.2'
编辑:
经过更多调试后,我将 gradle 改回如下:
compileSdkVersion 27
buildToolsVersion = '27.0.3'
targetSdkVersion 23
compile 'com.android.support:appcompat-v7:26.0.2'
现在只要把targetSdkVersion改成27,问题就来了。可跨越的事情与它无关。 TextViews 中的文本表现不同。甚至在 AndroidStudio xml 预览中显示 targetSdkVersion 设置为 27 时文本被剪切。
要对其进行测试,请使用上面的 gradle 设置创建一个项目。以及下面的 MainActivity 布局。将 targetSdkVersion 从 23 更改为 27,您应该会看到问题。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.ziadalhalabi.testspannable.MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Amin"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Bmin"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Cmaj"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Dmin"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Gmaj"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="C#min"
android:textSize="18sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="F#min"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
好的,我能够重现问题。 appcompat-v7
中完全有可能存在潜在错误。但是,您可以通过简化布局来解决此问题。在所有 TextView
小部件上用简单的 android:layout_width="wrap_content"
替换 android:layout_width="0dp"
和 android:layout_weight="1"
的组合:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Amin"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Bmin"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Cmaj"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Dmin"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="Gmaj"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="C#min"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:fontFamily="sans-serif-light"
android:gravity="center"
android:maxLines="1"
android:text="F#min"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
那,compileSdkVersion
和 targetSdkVersion
都设置为 27,并使用 appcompat-v7
的 27.0.2
,在 Nexus 5X 上给你这个 运行 Android8.1:
使用您最初的方法,似乎发生的事情是 Android 试图 word-wrap 这些行,但由于您将 maxLines
设置为 1
,它最终截断了这些行。