标签: spannablestringbuilder

SpannableStringBuilder创建具有多个字体/文本大小的String等示例?

我需要创建一个放在TextView中的String,它将显示如下字符串:

第一部分不大胆 大胆 休息不大胆

所以我想知道如何使用它SpannableStringBuilder来做到这一点?

我可以使用三个TextEdit来完成这个,但我想使用最佳解决方案.

android spannablestring spannablestringbuilder

70
推荐指数
8
解决办法
6万
查看次数

android SPAN_EXCLUSIVE_EXCLUSIVE 无法正常工作

我正在尝试使用标志 SPAN_EXCLUSIVE_EXCLUSIVE 在 SpannableStringBuilder 上设置跨度,并且在进一步编辑我设置跨度的文本时遇到问题。

预期行为 1:原始文本。2:之前添加的文字。3:文字后加空格。

在样式文本后添加文本时出现意外行为

我不希望添加的文本具有样式,并且想知道我做错了什么。

编辑 1:该问题发生在 Moto X Play 上,但未在 Nexus 5X 上重现。仍在其他设备上测试。

android spanned android-edittext spannablestringbuilder

6
推荐指数
1
解决办法
659
查看次数

SpannableStringBuilder用Regex替换内容

我有以下代码,其中我将标记花括号之间的内容SpannableString和删除花括号但它给出错误的结果.

String text = "the {quic}k brown {fox} jumps {over} the lazy dog. {A Quick} {brow}nfoxjumpsoverthelazydog";

tv.setText(makeSpannable(text, "\\{.*?\\}"));
public SpannableStringBuilder makeSpannable(String text, String regex) {
    SpannableStringBuilder spannable = new SpannableStringBuilder(text);
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(spannable.toString());
    while (matcher.find()) {
        String word = matcher.group();
        String abbr = word.toString().substring(1, word.length() - 1);
        spannable.setSpan(new ForegroundColorSpan(Color.RED), matcher.start(), matcher.end(),  Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannable.replace(matcher.start(), matcher.start() + abbr.length() , abbr);
    }
    return spannable;
}
Run Code Online (Sandbox Code Playgroud)

输入:

the {quic}k brown {fox} jumps {over} the lazy dog. {A …
Run Code Online (Sandbox Code Playgroud)

java regex android spannablestring spannablestringbuilder

5
推荐指数
1
解决办法
2235
查看次数

如何使 MaterialAlertDialogBu​​ilder 中的 ClickableSpan 链接可点击?

我有一个带有这样链接的SpannableStringBuilder对象,ClickableSpan

SpannableStringBuilder ssb = new SpannableStringBuilder("Hi StackOverflow!");

ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
    }
};

ssb.setSpan(clickableSpan, 3, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

TextView当我将其设置为 a并使用后效果很好textView.setMovementMethod(LinkMovementMethod.getInstance())

当我将ssb对象设置为 时MaterialAlertDialogBuilder

new MaterialAlertDialogBuilder(this)
                .setTitle("My Dialog")
                .setMessage(ssb)
                .show();
Run Code Online (Sandbox Code Playgroud)

它显示为可点击的链接,但实际上无法点击它 MaterialAlertDialogBu​​ilder 预览 我找不到使用setMovementMethod中的消息的方法MaterialAlertDialogBuilder。有什么办法让它可以点击吗?

android android-alertdialog clickablespan spannablestringbuilder material-components

5
推荐指数
1
解决办法
1646
查看次数

对于 api 26 及更低版本,将 TextAppearanceSpan 设置为 SpannableStringBuilder 时未应用字体

我正在尝试将 TextAppearanceSpan 设置为 SpannableStringBuilder。它适用于 API 27 及更高版本,但我找不到 api 26 及更低版本的解决方案。这是我正在使用的代码:

fun getMenuSpannable(context: Context, title: String): SpannableStringBuilder {
    return SpannableStringBuilder(title).apply {
        setSpan(TextAppearanceSpan(context, R.style.TextAppearance_Theme_Subtitle1), 0, title.length, 0)
    }
}

<style name="TextAppearance.Theme.Subtitle1" parent="TextAppearance.MaterialComponents.Subtitle1">
    <item name="typeface">MacanRegular</item>
    <item name="fontFamily">@font/macan_regular</item>
    <item name="android:fontFamily">@font/macan_regular</item>
    <item name="android:textSize">16sp</item>
    <item name="lineSpacingMultiplier">1.4</item>
    <item name="android:letterSpacing">-0.04</item>
</style>
Run Code Online (Sandbox Code Playgroud)

android android-typeface spannablestringbuilder

5
推荐指数
0
解决办法
164
查看次数

Android Spannable 在回收器视图适配器中不起作用

我有一个回收器视图,想更改 textview 文本某些部分的颜色。

这是我的代码:

public class MyAdapter extends RecyclerView.Adapter<MyEarningsAdapter.ViewHolder> {
    public ArrayList<WageItemDataSet> wageItemList;
    private Context context;
    private Spannable spanText;
    private ForegroundColorSpan fcs;
    private RelativeSizeSpan rss;
    public MyAdapter(Context context) {
        wageItemList = new ArrayList<>();
        this.context = context;
        fcs = new ForegroundColorSpan(Color.BLACK);
        rss = new RelativeSizeSpan(0.8f);
    }
 @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wage_list, parent, false));
    }
    @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            WageItemDataSet item = wageItemList.get(position);
            spanText = new SpannableString("Fare: "+item.totalFare);
            spanText.setSpan(fcs, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview spannablestringbuilder

2
推荐指数
1
解决办法
2910
查看次数

创建新的 SpannableStringBuilder 返回 null

这是我的单元测试。不知何故,当我使用非空字符串参数创建实例化 SpannableStringBuilder 实例时,它似乎为空。这段代码有什么问题?

public class CardNumberTextWatcherTest {

private CardNumberTextWatcher watcher;

@Before
public void setUp() throws Exception {
    watcher = new CardNumberTextWatcher();
}


@Test
public void afterTextChanged_cardNumberDividedWithSpaces() {
    assertTransformText("1111222233334444", "1111 2222 3333 4444");
}

private void assertTransformText(final String testStr,
                                 final String expectedStr) {
    final CardNumberTextWatcher watcher = new CardNumberTextWatcher();
    final Editable actualStr = new SpannableStringBuilder(testStr);
    // When I debug I see that actualStr value is null. Therefore test 
    //doesn't pass. What's the problem?
    watcher.transformText(actualStr);
    assertEquals(expectedStr, actualStr.toString());
}


}
Run Code Online (Sandbox Code Playgroud)

java android spannablestringbuilder

1
推荐指数
1
解决办法
1117
查看次数

Kotlin - 在为 setSpans() 声明开始、结束和标志时,为 SpannableStringBuilder 创建自定义 ext 函数而没有重复的参数

这是之前的 MainActivity.kt

var spannable = SpannableStringBuilder("$noColorText$coloredText")
spannable.setSpan(
    ForegroundColorSpan(ContextCompat.getColor(textView.context, R.color.mainGreen)),
    noColorText.length, spannable.length,
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
spannable.setSpan(
    StyleSpan(BOLD),
    noColorText.length, spannable.length,
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE
)
textView.text = spannable
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的方法。

扩展名.kt

// TODO: e.g: "string".putSpans(start, end, flags) { ForgroundColorSpan(color), StyleSpan(BOLD) }
fun String.putSpans(vararg flags: Int.() -> Unit, spanBuilder: SpannableStringBuilder.() -> Unit):
    SpannableStringBuilder = SpannableStringBuilder(this).apply(spanBuilder)
Run Code Online (Sandbox Code Playgroud)

主活动.kt

// TODO: Change SpannableBuilder to be modular (without, reinput duplicate args)
val resultSpan = "$noColorText$coloredText ".putSpans {
    setSpan(ForegroundColorSpan(ContextCompat.getColor(textView.context, R.color.mainGreen)),
        noColorText.length, this.length, // this is duplicate
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE) // this is duplicate
    setSpan(StyleSpan(BOLD),
        noColorText.length, …
Run Code Online (Sandbox Code Playgroud)

code-duplication kotlin kotlin-extension spannablestringbuilder

1
推荐指数
1
解决办法
2508
查看次数