有没有办法在文本中找到“上标跨越字符串”存在的地方,并将它们重新跨越为粗体?

问题描述

有没有办法在 TextView 中找到存在“上标跨越字符串”的地方,并将它们重新跨越为粗体?

例如 index(start:13,end 15),index(start 25,end 33) 等。然后对它们重新应用粗体。有什么想法吗?

解决方法

AFAIK 您无法直接获得 TextView 的特定样式部分(在您的情况下为上标)。

要解决这个问题,您需要在上标时保存开始/结束索引,并在需要加粗时再次使用它们。

你可以有一个 data/pojo 类来存储:id、startIndex、endIndex、styleType...等

然后你可以使用这个数据类来建立一个Room数据库。

您可以check documentation了解如何建立 Room 数据库,您也可以查看this以获得完整示例

但在这里我会给出一个骨架

数据/Pojo 类

@Entity(tableName = "spannable_data")
public class SpannableData {

    @PrimaryKey(autoGenerate = true)
    int id;
    int styleType;
    int startIndex;
    int endIndex;

    @Ignore
    public SpannableData(int styleType,int startIndex,int endIndex) {
        this.styleType = styleType;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }

    public SpannableData(int id,int styleType,int endIndex) {
        this.id = id;
        this.styleType = styleType;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getStyleType() {
        return styleType;
    }

    public void setStyleType(int styleType) {
        this.styleType = styleType;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public int getEndIndex() {
        return endIndex;
    }

    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }
}

道类

@Dao
public
interface SpannableDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertSpan(SpannableData spannableData);

    @Query("SELECT * FROM spannable_data WHERE styleType = :type")
    List<SpannableData> getSpans(int type);

    @Query("DELETE FROM spannable_data WHERE styleType = :type")
    void deleteSpans(int type);

    @Query("DELETE FROM spannable_data")
    void deleteAllSpans();

    @Delete
    void deleteSpan(SpannableData spannableData);

}

数据库类

@Database(entities = {SpannableData.class},version = 1,exportSchema = false)

public abstract class SpannableDatabase extends RoomDatabase {

    public static final String DATABASE_NAME = "MyDatabase.db";

    private static volatile SpannableDatabase INSTANCE;

    // used from synchronization (to avoid any race conditions) so that make sure that two parts of the app don’t try to create the database at the same time
    private static final Object LOCK = new Object();

    public abstract SpannableDao getSpannableDao();

    static public SpannableDatabase getInstance(final Context context) {
        if (INSTANCE == null) {
            synchronized (LOCK) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),SpannableDatabase.class,DATABASE_NAME)
                            .build();
                }
            }
        }
        return INSTANCE;
    }

}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...