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>

那,compileSdkVersiontargetSdkVersion 都设置为 27,并使用 appcompat-v727.0.2,在 Nexus 5X 上给你这个 运行 Android8.1:

使用您最初的方法,似乎发生的事情是 Android 试图 word-wrap 这些行,但由于您将 maxLines 设置为 1,它最终截断了这些行。