我有一个TextView存储长度为两行的地址.街道在第一行,并且是大胆的.城市和州都走在第二线,并不是大胆的.如果该行上的单个文本运行,我希望每行的结尾都是椭圆形的.我使用a SpannableString来存储地址,因为我希望街道地址是粗体,而城市和州不是粗体.
有没有一种方法可以做到这一点,而不是完全黑客而不使用TextViews每行两个?
示例输出:
例如:
123812 Washington A ...
Schenectady New Yor ...
例:
2792 Dantzler Boulev ......
Charleston SC,29406
例如:
3大街
亚特兰大GA
ListView滚动时为什么链接会丢失?从调试很明显,跨越不添加第二个时间上的TextView距离convertView.
这是从适配器调用的一段代码getView.
...
String body = MyItemDetails.getBody(); // String to linkify
final Spannable spannable = MyCustomUri.addHashtagSpans(context, body);
viewHolder.textView.setText(spannable);
viewHolder.textView.setTextIsSelectable(true); // adds additional spans
viewHolder.textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
viewHolder.textView.setAutoLinkMask(Linkify.WEB_URLS);
...
Run Code Online (Sandbox Code Playgroud)
MyCustomUri.addHashtagSpans()使用extends 创建一个SpannableStringwith .MyCustomSpanURLSpan
问题是当我在ListView链接中向上和向下滚动时丢失了.而当屏幕第一次打开时,它设置正确.
现在我通过禁用重convertView用来做出一个肮脏的修复:(任何想法如何更好地解决这个问题?
我正在使用一个Activity来解析带有标记字符的文本.我正在做的是将它们转换为几种类型的ClickableSpans.
问题是我需要实现一个函数(让我们称之为函数B),这意味着有重叠的ClickableSpans并导致一些问题.
所以我现在正在做的是在检测重叠跨度的同时创建一个新的SSB,并删除我不需要这个特定功能的SSB.工作正常.
但是,我需要能够回到之前的SSB,这似乎不起作用.
一步步:
// I CREATE THE SSBs
...
static SpannableStringBuilder ssb;
static SpannableStringBuilder ssbCopy;
// I IMPLEMENT MY CUSTOM FUNCTION THAT PARSES THE TEXT AND SETS THE SBB AS A TEXTVIEW CONTENT
...
textView.setMovementMethod(new LinkTouchMovementMethod());
ssb = addClickablePart(chapterTextStr, markupCharactersArray);
textView.setText(ssb);
// WHEN A BUTTON IS CLICKED I IMPLEMENT MY FUNCTION B. WHERE I CREATE A COPY OF MY ORIGINAL SSB AND STORE IT IN ssbCopy, AND SET IT AS THE TEXTVIEW CONTENT
...
ssbCopy = SpannableStringBuilder.valueOf(ssb);
// …Run Code Online (Sandbox Code Playgroud) 我已经为SpannableStrings" ImageURLSpan"扩展了一个自定义范围ImageSpan.
RemoteImageDrawable",它呈现静态占位符,从Internet加载图像,然后在图像加载完成后,它应该渲染加载的位图而不是占位符.如果draw()再次调用drawable 的方法(由父级view?)会发生这种情况我的问题是,在可绘制级别,我不知道如何在将来的任何时候触发"自动刷新"(一旦加载图像).我试图invalidate用不一致的结果调用父视图:有时候再次调用drawable的draw方法 - 所以它被正确刷新 - 有时它不是.这完全是随机的!
什么是drawable的正确方法,将其内容更改为"使自己无效"?不应该使父View的失效导致所有子drawables无效?我是否需要使用Drawable回调或者它们与我的问题无关?
请找附件相关代码:
public class ImageUrlSpan extends ImageSpan {
public ImageUrlSpan(final View parentView, String imageUrl, int width, int height) {
super(
new RemoteImageDrawable(
parentView, imageUrl, width, height, new ImageLoaders.OnDrawableDownloadListener() {
@Override
public void onDrawableLoaded(Drawable bitmap) {
parentView.invalidate();
// this works sometimes
if (Conf.LOG_ON) Log.v(TAG, "Invalidating parent view... will that refresh myself? "+parentView);
}
}
));
}
}
Run Code Online (Sandbox Code Playgroud)
关于代码RemoteImageDrawable …
我通过多个span样式设置了几个单词,当我将带有样式的数组传递给方法时,结果中只有最后一个单词具有该样式.它省略了其他的话.为什么?在我的代码和执行下面.先感谢您.
//execution in code
charSequence = SpannableUtils.format(
charSequence,
new ParcelableSpan[]{new StyleSpan(Typeface.BOLD)},//or more
new String[]{"Test1", "Test2"}
);
//method
public static CharSequence format(CharSequence charSequence, ParcelableSpan[] spans, String[] words) {
SpannableStringBuilder ssb = new SpannableStringBuilder(charSequence);
for (String word : words) {
Pattern pattern = Pattern.compile(Pattern.quote(word));
Matcher matcher = pattern.matcher(charSequence);
for (ParcelableSpan span : spans) {
while (matcher.find()) {
ssb.setSpan(span, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
return ssb;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我用'instance of'检查span的类型,然后我创建新的constructior它可以工作.为什么?
我有以下代码,其中我将标记花括号之间的内容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.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary (46 follows )
at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:161)
at android.text.SpannableStringInternal.copySpans(SpannableStringInternal.java:67)
at android.text.SpannableStringInternal.<init>(SpannableStringInternal.java:42)
at android.text.SpannedString.<init>(SpannedString.java:30)
at android.text.method.ReplacementTransformationMethod.getTransformation(ReplacementTransformationMethod.java:83)
at android.widget.TextView.setText(TextView.java:4436)
at android.widget.TextView.setText(TextView.java:4332)
at android.widget.TextView.setText(TextView.java:4307)
Run Code Online (Sandbox Code Playgroud)
我打电话像
myAsyncTask().execute(source, listDrawable, textView.getContext());
return listDrawable;
}
}, new MyTagHandler());
textView.setText(htmlText);
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决上述问题
我有一个问题说明,我需要在启用“可访问性”设置的情况下运行我的应用程序,以提供反馈意见,但是这里的问题是当我单击TextView其中具有“可扩展性”链接的,然后它会读取全文但不允许我可以在禁用可访问性的同时分别单击该Spannable文本,以使字符串可多跨度或链接可单击。
这是我要String点击的代码:
SpannableString ss = new SpannableString("Android is a Software stack");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
startActivity(new Intent(MyActivity.this, NextActivity.class));
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView textView = (TextView) findViewById(R.id.hello);
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.TRANSPARENT);
Run Code Online (Sandbox Code Playgroud) android accessibility-api textview spannablestring android-accessibility
因此,正如您大多数人所知,Android中的TextView中没有文本可辩解。因此,我构建了一个自定义TextView来解决此问题。但是,由于某些原因,有时标点符号会在某些设备中由于某些原因而中断。我在LG G3和模拟器(运行最新版本的Nexus 4)和逗号“”上进行了测试,例如,它打破了LG G3而不是模拟器的理由。
如果我添加至少2的填充开始和结束(或左右),则此问题已解决。在我看来,这很武断。
基本上,我的逻辑是为了证明文本的正确性,我需要知道TextView本身的宽度,将文本构造成最大长度的行。然后,通过查找行中的空格数和剩余的空白空间,根据剩余的像素(或视图中的空格)拉伸要缩放的“”(空格)字符。
它几乎可以完美运行,并且在大多数情况下,它也支持RTL文本。
这是一些带有和不带有冒犯性标记的文本图片(一个简单的lorem插值)(第一张在运行7.1.1的模拟器nexus 4上,第二张在运行v5.0的LG G3上)

这是代码:
public class DTextView extends AppCompatTextView {
private boolean justify;
public DTextView(Context context) {
super(context);
}
public DTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public DTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void setJustify(boolean justify) {
this.justify = justify;
if (justify) {
justify();
}
}
private void init(@Nullable AttributeSet attrs) {
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.DTextView, 0, 0);
justify = …Run Code Online (Sandbox Code Playgroud) 我在SpannableStringInternal中收到了针对NPE的Crashlytics的错误报告,但无法在任何手机上重现该问题或确定其来源.我正在呼吁互联网帮助我找出潜在的问题.
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
at android.text.SpannableStringInternal.hashCode(SpannableStringInternal.java:480)
at android.text.SpannedString.hashCode(SpannedString.java)
at java.util.Objects.hashCode(Objects.java:98)
at android.view.inputmethod.CursorAnchorInfo.<init>(CursorAnchorInfo.java:435)
at android.view.inputmethod.CursorAnchorInfo.<init>(CursorAnchorInfo.java)
at android.view.inputmethod.CursorAnchorInfo$Builder.build(CursorAnchorInfo.java:391)
at android.widget.Editor$CursorAnchorInfoNotifier.updatePosition(Editor.java:4390)
at android.widget.Editor$PositionListener.onPreDraw(Editor.java:3250)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1013)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2492)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1509)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7051)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
at android.view.Choreographer.doCallbacks(Choreographer.java:702)
at android.view.Choreographer.doFrame(Choreographer.java:638)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6692)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
Run Code Online (Sandbox Code Playgroud)
从源代码看起来,某种程度上光标/选择导致设置空Spans.