标签: spannablestring

通过参数将Spannable应用到string.xml中的字符串

我在中定义了以下字符串string.xml

<string name="photo_heading"><xliff:g name="name">%s</xliff:g> shared a <xliff:g name="permission">%s</xliff:g><xliff:g name="photo">%s</xliff:g> with you.</string>
Run Code Online (Sandbox Code Playgroud)

String 接受 3 个字符串参数:name, permission,photo

我有两种设置不同风格的方法。

public Spannable getStyledItalic(String text) {
        Spannable sb = new SpannableString(text);
        sb.setSpan(new StyleSpan(Typeface.ITALIC), 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        return sb;
    }
Run Code Online (Sandbox Code Playgroud)

public Spannable getStyledName(String name) {
        Spannable sb = new SpannableString(name);
        sb.setSpan(new AbsoluteSizeSpan(LPConstants.FONT_SIZE_NAME), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        sb.setSpan(new StyleSpan(Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        sb.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.app_primary)), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        return sb;
    }
Run Code Online (Sandbox Code Playgroud)

现在我将这些样式应用于不同的参数并返回字符串,但这不起作用。这是我正在做的事情:

public String getHeading(Printrequest printRequest) {
        String name = printRequest.sentbyname;
        String …
Run Code Online (Sandbox Code Playgroud)

xml string android spannablestring

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

在编辑文本中设置下划线范围而不删除自动建议

我没想到这是一个问题,但我不能简单地在编辑文本中的单词下划线,因为软键盘的自动建议功能中的下划线会自动为选定的单词加下划线。但是,我仍然想在应用下划线时保留该功能。

在编辑文本中:

默认情况下,选定的单词会自动添加下划线

默认情况下,选定的单词会自动添加下划线,然后当单击空格时,下划线将被删除,因此当我通过按钮应用下划线范围然后点击空格时,它会被删除。

应用下划线:-

SpannableString word = new SpannableString(noteview.getText());

word.setSpan((new UnderlineSpan()), 0, word.length(), 0);

edittext.setText(word);
Run Code Online (Sandbox Code Playgroud)

如果未选择该单词,此代码可以正常工作,因此我尝试在跨越之前更改选择,但仍然没有解决。是否有解决方法可以删除自动建议下划线?

android autosuggest android-softkeyboard android-edittext spannablestring

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

在 StyleSpan 中,为什么 Typeface to NORMAL 不能应用于 Typeface to BOLD?

Button btnBold = (Button) findViewById(R.id.btnBold);
    btnBold.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick (View v){
        startSelection = etx.getSelectionStart();
        endSelection = etx.getSelectionEnd();


        Spannable s = etx.getText();
        s.setSpan(new StyleSpan(Typeface.BOLD), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});


Button btnNormal = (Button) findViewById(R.id.btnNormal);
    btnNormal.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick (View v){
        startSelection = etx.getSelectionStart();
        endSelection = etx.getSelectionEnd();
        Spannable s = etx.getText();
        s.setSpan(new StyleSpan(Typeface.NORMAL), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
});
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我尝试对按钮中选定的文本进行加粗和取消加粗。

例如: 我通过一次选择所有内容将这一行加粗。

现在,如果我通过选择上行中的一些文本来应用取消粗体,那么它将不起作用。

我已经浏览过这些答案,但没有运气:

如何取消 Android Edittext 中选定文本的粗体?

删除跨度上的样式

从 edittext 中选定的文本中删除样式

上述解决方案的问题在于,例如,如果您从文本中选择了五个单词并将它们设置为粗体,现在您选择了该粗体文本的某些部分并取消粗体,那么所有五个单词都将取消粗体。

上述链接中提到的解决方案使用以下代码来删除跨度,这不能正确解决问题

Spannable str = …
Run Code Online (Sandbox Code Playgroud)

android spanned android-edittext spannablestring spannable

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

SpannableString 中的内存泄漏,取决于我放置 ClickableSpan 的位置

所以,....

我有这个代码(onStart):

ss = new SpannableString(getString(R.string.legal_user_acceptance_disclaimer));
ss.setSpan(clickableSpanTermsOfUse, 32, 44, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

它泄漏了父级- Activity(这些行在里面)。

如果我只改变数字:

ss.setSpan(clickableSpanTermsOfUse, 49, 63, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

泄漏消失。

clickableSpanTermsOfUse (memory leak is the same with a normal ClickableSpan):

clickableSpanTermsOfUse = new NoRefCopySpan() {
        @Override
        public void onClick(View textView) {
            startActivity(new Intent(ChooseLoginRegistrationActivity.this, PrivacyStatement.class));//, TermsOfUse.class));
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    };

public class NoRefCopySpan extends ClickableSpan implements NoCopySpan {
    @Override
    public void onClick(@NonNull View widget) { }

    @Override
    public void updateDrawState(TextPaint ds) …
Run Code Online (Sandbox Code Playgroud)

memory android memory-leaks spannablestring

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

第一个setSpan没有用

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD);
final SpannableString ss = new SpannableString("How to " + text + " in " + type);
ss.setSpan(bss, 7, text.length() + 7, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
ss.setSpan(bss, 7 + text.length() + 4, ss.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(ss);
Run Code Online (Sandbox Code Playgroud)

我想做texttype 大胆.但只有类型是BOLD.

我错过了什么?

android spannablestring

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

如何在Android中将样式文本分解为页面?

我有一个很长的文本,我想打破多个页面.我还需要一种方式来设置这个文本的样式.

android text page-break styledtext spannablestring

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

在android中处理SpannableStringBuilder图像

我正在开发一个应用程序,其中选定的联系人添加到EditText一个关闭标记图像,当我点击该关闭标记图像时,应删除该联系人.我已完成代码显示关闭标记图像,但我不知道如何处理那些关闭标记图像.请建议我如何.

在此输入图像描述

我的代码:

for (int i = 0; i < selectedItems.size(); i++) {
                    String na = selectedItems.get(i);
                    TextView tv = createContactTextView(na);
                    BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
                    bd.setBounds(0, 0, bd.getIntrinsicWidth(),
                            bd.getIntrinsicHeight());
                    sb.append(na + ",");
                    sb.setSpan(new ImageSpan(bd), sb.length()
                            - (na.length() + 1), sb.length() - 1,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }

                txt.setText(sb);

private Object convertViewToDrawable(TextView view) {
        int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        view.measure(spec, spec);
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),
                view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = …
Run Code Online (Sandbox Code Playgroud)

android drawable android-edittext spannablestring spannable

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

TextView中动态文本颜色更改的最有效方法

我想用计时器多次改变文本部分的颜色.

最简单的方法是:

SpannableStringBuilder ssb = new SpannableStringBuilder(mainText);
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
ssb.setSpan(span, start, end, 0);
tv.setText(ssb);
Run Code Online (Sandbox Code Playgroud)

但是如果我在一秒钟内多次运行上面的代码,我实际上TextView每次都会更改整个(大)文本,因此特别是在低端设备上会发生不需要的内存CPU负载.

我怎样才能Span打开一个TextView并且只改变Span开始和结束位置?

它会起作用还是全文替换将在幕后发生?

我的文字是固定的,永远不会改变.

android textview spannablestring

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

使用AppCompat主题时,SpannableString无法正常工作

当我将AppTheme设置为Theme.AppCompat.Light.DarkActionBar时,我无法使SpannableString工作.

我有一个按钮,其文本设置为SpannableString.当我使用Holo主题时,文本按预期呈现,但是当我切换到AppCompat主题时,span效果会被忽略.如何使用AppCompat主题使SpannableString工作?

在此输入图像描述

styles.xml - 当在这两个主题之间切换时,我得到了非常不同的结果......

<resources>
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" />
  <!--<style name="AppTheme" parent="@android:style/Theme.Holo.Light" />-->
</resources>
Run Code Online (Sandbox Code Playgroud)

...对于使用SpannableString的按钮

public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);

        String detail = "ABC";
        String caption = String.format("2 %s", detail);
        Spannable span = new SpannableString(caption);

        int detailIndex = caption.indexOf(detail);

        span.setSpan(new StyleSpan(Typeface.BOLD), 0, detailIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        span.setSpan(new RelativeSizeSpan(0.5f), detailIndex, detailIndex+detail.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        button.setText(span);

        return rootView; …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat spannablestring

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

如何从 SpannableString 中删除跨度样式

我试图从我的样式中删除样式SpannableString但不幸的是不起作用,我的目标是在单击文本时删除样式。

SpannableString content = new SpannableString("Test Text");
content.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, content.length(), 0);
...
Run Code Online (Sandbox Code Playgroud)

点击操作:

content.removeSpan(new StyleSpan(Typeface.BOLD_ITALIC)) // not working
Run Code Online (Sandbox Code Playgroud)

android spannablestring

4
推荐指数
2
解决办法
3636
查看次数