问题描述
有没有办法在 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;
}
}