首页 > 解决方案 > Is there a way to find in a text the places where the "superscript spanned strings" are existing, and respan them as bold?

问题描述

Is there a way to find in a TextView the places where the "superscript spanned strings" are existing, and respan them as bold?

For example index(start:13, end 15), index(start 25, end 33) etc. And then reapply a bold span to them. Any ideas?

标签: androidtextviewspannablestring

解决方案


AFAIK,您无法直接获取TextView.

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

您可以拥有一个数据/pojo 类来存储:id、startIndex、endIndex、styleType...等

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

您可以查看文档以了解如何构建 Room 数据库,也可以查看完整示例

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

数据/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 startIndex, 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;
    }

}

推荐阅读