我现在试图解决我的问题2天,但没有任何成功.
问题是:当我将BulletSpan设置为文本然后在EditText中显示时,一切正常,直到我开始输入另一个文本.当文本被包裹在屏幕的末尾时,缩进工作但光标指向实际位置,并且光标之后还添加了前一行中的一些字符.为了更好地说明此问题,请参阅附图.
还值得一提的是,只有当我输入文本时才会发生这种情况,当我在源文本中设置文本并且文本太长而不能只在一行上时,包装工作正常并且没有添加额外的字符也没有添加光标位置是错的.
我也试过LeadingMarginSpan.Standart,行为是一样的.
在代码我设置开始标记:
private void handleListStart(SpannableStringBuilder text) {
int len = text.length();
text.setSpan(new ListItem(), len, len, Spannable.SPAN_MARK_MARK);
}
Run Code Online (Sandbox Code Playgroud)
然后设置范围:
private void handleListEnd(SpannableStringBuilder text) {
int len = text.length();
Object obj = getLast(text, ListItem.class);
int where = text.getSpanStart(obj);
text.removeSpan(obj);
if (where != len) {
text.setSpan(new BulletSpan(listIndent * 15), where, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
Run Code Online (Sandbox Code Playgroud)
我从xml文件中获取数据.
谢谢你的帮助
编辑:我忘了补充一点,我在Android 4.1和4.4上尝试了这一点,两者表现相同
我正在尝试利用 ReplacementSpans 来格式化 EditText 字段中的输入(不修改内容):
public class SpacerSpan extends ReplacementSpan {
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
return (int) paint.measureText(text.subSequence(start,end)+" ");
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
canvas.drawText(text.subSequence(start,end)+" ", 0, 2, x, y, paint);
}
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作,并在跨越部分后增加间距。但是,如果我还应用了 ForegroundColorSpan,则不会为跨区部分设置颜色:
EditText edit = (EditText) findViewById(R.id.edit_text);
SpannableString content = new SpannableString("1234567890");
ForegroundColorSpan fontColor = new ForegroundColorSpan(Color.GREEN);
SpacerSpan spacer …Run Code Online (Sandbox Code Playgroud) 我正在尝试将带边框的背景应用于TextView. ABackgroundColorSpan很好用,但它没有边框。为了获得边框,我改为使用 customReplacementSpan和 override draw。它看起来很适合短词/句子,但它无法换行。如何制作我的自定义ReplacementSpan包装?



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_replacement_span);
final Context context = this;
final TextView tv = (TextView) findViewById(R.id.tv);
Spannable span = Spannable.Factory.getInstance().newSpannable("Some long string that wraps");
//Works great, but no border:
//span.setSpan(new BackgroundColorSpan(Color.GREEN), 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//Has border, but doesn't wrap:
span.setSpan(new BorderedSpan(context), 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(span, TextView.BufferType.SPANNABLE);
}
public static class BorderedSpan extends ReplacementSpan {
final Paint mPaintBorder, mPaintBackground;
int mWidth;
Resources r;
int …Run Code Online (Sandbox Code Playgroud) 我将Image Drawable设置为Textn的SpannableString,但图像比文本更大,使它看起来很奇怪.我需要减小imagespan的大小,使其与文本的高度相同:
这是我尝试过的:
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
SpannableStringBuilder builder = new SpannableStringBuilder(holder.temptext.getText());
builder.setSpan(new ImageSpan(drawable), selectionCursor - ":)".length(), selectionCursor, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.temptext.setText(builder);
holder.temptext.setSelection(selectionCursor);
holder.caption.setText(builder);
Run Code Online (Sandbox Code Playgroud) 我正在尝试用span来替换从getText()返回的可编辑部分.
我尝试过getText().replace(),但这只适用于CharSequences.
我试图这样做的原因是我可以一个接一个地突出显示EditText的部分(经过一小段延迟),而不是通过并突出显示整个EditText(对于大文件来说可能很慢).
有没有人知道我将如何做到这一点?
我想为一个单词设置自定义字体,该单词出现在字符串中的任何位置.
例:海@abc你好吗?亲爱的朋友你好,你在哪里@abc
在上面的例子中,我必须为"abc"应用自定义字体.我尝试过Spannable类,但我无法得到它.
final TextView txtComments = (TextView)view.findViewById(R.id.tv_comments);
SpannableStringBuilder SS = new SpannableStringBuilder(alcomments.get(i));
SS.setSpan (new CustomTypefaceSpan("", tf), 0, SS.length(),Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
txtComments.setText(SS);
Run Code Online (Sandbox Code Playgroud)
但它影响整个字符串.请指导我如何实现它.
mSpannableString = new SpannableString("12:00PM");
mSpannableString.setSpan(clickableSpan, 0, 7, 0);
mSpannableString.setSpan(new StyleSpan(Typeface.BOLD), 0, 7, 0);
TextView textView = new TextView(getContext());
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(mSpannableString);
mCancelFrom.setText(getString(R.string.cancel_from_text) + " " + mSpannableString);
Run Code Online (Sandbox Code Playgroud)
我需要将文本设置为粗体并使其可单击.上面的代码我写在一个对话框中.字符串"12:00 PM"正在显示.但它没有大胆的效果,也无法点击.你能用这个帮我吗?
我正在开发一个 Flutter 应用程序,它使用 Textfield.
我声明TextField如下:
new TextField(
controller : _controller,
decoration : new InputDecoration(
hintText: 'Message...'
)
)
Run Code Online (Sandbox Code Playgroud)
该TextField显示在我的窗口小部件,但是当我在上面敲击时,键盘会自动关闭,以下错误出现在控制台
E/SpannableStringBuilder(17860): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
Run Code Online (Sandbox Code Playgroud)
我在 Android(三星 Galaxy Grand Prime,Android 5.1)上使用 IntelliJ 中的 Flutter 插件运行它。
我怎么能解决这个问题?
编辑:正如在这个答案中看到的(Android - SPAN_EXCLUSIVE_EXCLUSIVE 跨度不能为零长度),我试过切换键盘(谷歌和三星),仍然相同
我有自动链接的textview,但每当我将自定义范围(ClickableSpan)添加到textview时,它自动链接到网址和手机号码无效.有没有简单的方法来解决这个问题.应用样式但单击不起作用.
我尝试在单元测试中比较两个 SpannableStrings 文本,但收到错误:
java.lang.RuntimeException: Method toString in android.text.SpannableString not mocked. See http://g.co/androidstudio/not-mocked for details.
Run Code Online (Sandbox Code Playgroud)
调试后,我验证在单元测试中根本无法使用 SpannableString 类。
测试实施:
java.lang.RuntimeException: Method toString in android.text.SpannableString not mocked. See http://g.co/androidstudio/not-mocked for details.
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
java.lang.RuntimeException: Method toString in android.text.SpannableString not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.text.SpannableString.toString(SpannableString.java)
at java.lang.String.valueOf(String.java:2994)
at view_model.ViewModelTest$When getCredits() returns multiple invites$1.invokeSuspend(ViewModelTest.kt:113)
at ViewModelTest$When getCredits() returns multiple invites$1.invoke(ViewModelTest.kt)
at kotlinx.coroutines.test.TestBuildersKt$runBlockingTest$deferred$1.invokeSuspend(TestBuilders.kt:50)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.test.TestCoroutineDispatcher.dispatch(TestCoroutineDispatcher.kt:50)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:305) ...
Run Code Online (Sandbox Code Playgroud)
showInvitesTextValue 变量初始化时发生错误。
如何在单元测试中使用 SpannableString 类?
android ×10
spannablestring ×10
textview ×3
autolink ×1
custom-font ×1
flutter ×1
imagespan ×1
kotlin ×1
replace ×1
spannable ×1
testing ×1
text ×1
textedit ×1
unit-testing ×1