我需要创建一个放在TextView中的String,它将显示如下字符串:
第一部分不大胆 大胆 休息不大胆
所以我想知道如何使用它SpannableStringBuilder来做到这一点?
我可以使用三个TextEdit来完成这个,但我想使用最佳解决方案.
我正在尝试使用标志 SPAN_EXCLUSIVE_EXCLUSIVE 在 SpannableStringBuilder 上设置跨度,并且在进一步编辑我设置跨度的文本时遇到问题。
预期行为 1:原始文本。2:之前添加的文字。3:文字后加空格。
我不希望添加的文本具有样式,并且想知道我做错了什么。
编辑 1:该问题发生在 Moto X Play 上,但未在 Nexus 5X 上重现。仍在其他设备上测试。
我有以下代码,其中我将标记花括号之间的内容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) 我有一个带有这样链接的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)
它显示为可点击的链接,但实际上无法点击它
我找不到使用setMovementMethod中的消息的方法MaterialAlertDialogBuilder。有什么办法让它可以点击吗?
android android-alertdialog clickablespan spannablestringbuilder material-components
我正在尝试将 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) 我有一个回收器视图,想更改 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) 这是我的单元测试。不知何故,当我使用非空字符串参数创建实例化 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) 这是之前的 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