标签: spannable

如何使用支持库字体功能作为TextView内容的一部分(使用spannable)?

背景

支持库(此处为docs )允许您在XML中使用"res/font"文件夹中的TTF字体文件:

app:fontFamily="@font/lato_black"
Run Code Online (Sandbox Code Playgroud)

或通过代码:

val typeface = ResourcesCompat.getFont(context, R.font.lato_black)
Run Code Online (Sandbox Code Playgroud)

问题

虽然我知道可以使用spannable技术在TextView内容的部分内容中设置不同的样式(例如粗体,斜体,颜色等等),但我发现设置不同字体的唯一方法就是使用内置在操作系统的字体,如这里,但我不能看到一个办法做到这一点的加载字体的新途径.

我试过的

我试图找到一种方法来转换两者,但没有运气.当然,我也试图在可能的功能的文档中找到,并且我试图通过互联网找到它.

这个问题

如何为TextView的不同部分设置不同的字体?

例如,在文本"Hello world"中,将"Hello"设置为"lato_black"的字体,其余为默认值.


编辑:由于我得到了来自两个不同的人的相同答案,我不能接受另一个.给他们两个+1的努力,我已经改变了一点问题:

我如何轻松地将字体样式设置为文本的一部分,同时让strings.xml文件使用自定义字体标记定义它.

例如,这可以在strings.xml文件中进行设置,如上所述:

<string name="something" ><customFont fontResource="lato_black">Hello</customFont> world</string>
Run Code Online (Sandbox Code Playgroud)

然后,在代码中,您要做的就是使用以下内容:

textView.setText (Html.fromHtml(text, null, CustomFontTagHandler()))
Run Code Online (Sandbox Code Playgroud)

我认为这非常重要,因为翻译后的字符串可能与英语中的字符串差别太大,因此您不能只解析字符串的文本,然后选择设置自定义字体的位置.它必须在strings文件中.

fonts android textview spannable android-typeface

10
推荐指数
2
解决办法
1340
查看次数

为什么我的spannable没有显示?

背景

我正在尝试使用一个简单的SpannableStringon TextView,基于我发现的UnderDotSpan类(这里).

原始的UnderDotSpan只在文本本身下方放置一个特定大小和颜色的点(不重叠).我正在尝试的是首先正常使用它,然后使用自定义的drawable而不是dot.

问题

与正常的跨度使用相反,这个只是没有显示任何东西.甚至没有文字.

以下是正常跨度的完成方式:

val text = "1"
val timeSpannable = SpannableString(text)
timeSpannable.setSpan(ForegroundColorSpan(0xff00ff00.toInt()), 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.setText(timeSpannable);
Run Code Online (Sandbox Code Playgroud)

它将在TextView中显示绿色"1".

但是当我尝试下一个spannable时,它(整个TextView内容:文本和点)根本不显示:

val text = "1"
val spannable = SpannableString(text)
spannable.setSpan(UnderDotSpan(this@MainActivity, 0xFF039BE5.toInt(), textView.currentTextColor),
                0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.setText(spannable, TextView.BufferType.SPANNABLE)
// this also didn't work:       textView.setText(spannable)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在我使用的一个项目中,它在RecyclerView中运行良好,而在另一个项目中,它没有.

这是UnderDotSpan的代码:

class UnderDotSpan(private val mDotSize: Float, private val mDotColor: Int, private val mTextColor: Int) : ReplacementSpan() {
    companion object {
        @JvmStatic
        private val DEFAULT_DOT_SIZE_IN_DP = 4
    }

    constructor(context: Context, dotColor: …
Run Code Online (Sandbox Code Playgroud)

android textview spanned spannable

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

Android Compose:如何在文本视图中使用 HTML 标签

我有来自外部源的字符串,其中包含以下格式的 HTML 标记:“你好,我是 <b> 粗体</b> 文本”

在 Compose 之前,我会在 HTML 字符串的开头使用 CDATA,使用 Html.fromHtml() 转换为 Spanned 并将其传递给 TextView。TextView 会将粗体字加粗。

我试图用 Compose 复制这个,但我找不到让我成功实现它的确切步骤。

任何建议都非常感谢。

html android spannable android-jetpack-compose

9
推荐指数
7
解决办法
1292
查看次数

Android:如何将Spannable.setSpan与String.format结合起来?

我正在设置Span文本的一部分.跨度本身运作良好.然而,文本是由String.formatfrom 创建的Resources,我不知道,start并且end我将要将Span设置为文本的一部分.

我tryed使用自定义HTML代码strings.xml,但无论是getTextgetString删除它们.我可以用这样的事情getString(R.string.text, "<nb>" + arg + "</nb>"),那么Html.fromHtml(),因为arg正是在这里我想设置的跨度.

我看到这种使用文本格式化的方法"normal text ##span here## normal text".它解析字符串删除标签并设置Span.

我的问题是,是否有更好的方法来完成将Span设置为格式化字符串,"something %s something"或者我应该使用上述方法之一?

resources android spannable

8
推荐指数
2
解决办法
3402
查看次数

文本在EditText中与ImageSpan混淆

我正在构建一个简单的聊天应用程序,用户可以在其中发送文本和表情符号.我可以将文字和表情符号发送到另一部手机.我的问题是:

1.当我输入内容并添加表情符号时:

在此输入图像描述

然后我无法在图像之前和之后输入任何文本.我可以在"o"字母前面写.系统"看到"我输入的内容,所以即使我在笑脸后输入"Honey",我也看不到它,但EditText会注册它并发送消息:

在此输入图像描述

2.当我向Edittext添加一个表情符号然后删除它时,我无法输入任何内容,因为删除的表情符号出现了.它只出现一次,所以无论我输入多少个字符,EditText看起来就像我删除表情符号之前,但文本是在没有表情符号的情况下发送的,就像在所有三种情况下一样.

3.当我在EditText中输入"something"时,在"some"之后插入一个表情符号:

在此输入图像描述

然后我将光标放在表情符号后面并删除它,这里剩下的是:

在此输入图像描述

但是当我按下发送按钮时会发送正确的消息:

在此输入图像描述

这就是表情符号按钮监听器内部的内容(当我单击表情符号将其添加到EditText时,此方法被激活).

ib_happy.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        int cursorPosition = mOutEditText.getSelectionStart();
            mOutEditText.getText().insert(cursorPosition, smileys[0]);
        SpannableStringBuilder ssb = new SpannableStringBuilder(mOutEditText.getText());
        ssb.setSpan(new ImageSpan(bitmapArray.get(0), ImageSpan.ALIGN_BASELINE), cursorPosition,  cursorPosition+2, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        mOutEditText.setText(ssb, BufferType.SPANNABLE);
            mOutEditText.setSelection(cursorPosition+2);
        dialog_emoticon.dismiss();
    }
});
Run Code Online (Sandbox Code Playgroud)

android android-edittext spannablestring spannable

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

SpannableString在横向模式下无法正确显示

我有一段代码,使用SpannableString将一些图像添加到EditText中,如下所示:

SpannableString ss = new SpannableString("Some random String in my application.");
Drawable d = getResources().getDrawable(R.drawable.emoticon_0001);
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
ss.setSpan(span, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

我之间有一些指数计算,因为它们并不重要.代码工作正常.以下是它的一些图像:

非编辑模式下的纵向和横向:

肖像 景观

但是,一旦我开始在横向模式下编辑,图像后面的文字就会出现:

我的名字是问题,大问题

正如大多数人所知,奇怪的String表示iPhone中Emoticon的Unicode.以前有人遇到过这个问题吗?

编辑:测试android:imeOptions="actionDone|flagNoExtractUi",不起作用,单词建议将掩盖我的EditText.

android android-layout spannable

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

如何在多个spannable设置时获取文本宽度

我为spannableText设置了span并将其设置为TextView.在我想要获得此文本的宽度和高度之后.但是结果没有考虑由于设定的跨度而导致的文本大小的变化.下一个解决方案是错误的.

return textView.getPaint().measureText(text, 0, text.length());
Run Code Online (Sandbox Code Playgroud)

android paint textview measure spannable

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

如何在editText中处理imageSpan上的onClick事件?

我正在开发一个应用程序,用户从库中选择一个图像,它将添加到editText中,现在我想如果用户点击editText中的图像,它应该在fullScreen中打开,我使用下面的代码: -

public void addToEdt(Bitmap bitmap){
    SpannableString ss = new SpannableString("abc");
    Drawable d = new BitmapDrawable(getResources(), bitmap);
    d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
    ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
    ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    edt_note.setTransformationMethod(null);
    edt_note.getText().insert(edt_note.getSelectionStart(), ss);

    final int start = ss.getSpanStart(span);
    final int end = ss.getSpanEnd(span);

    ClickableSpan click_span = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
                   Toast.makeText(getApplicationContext(),"Clicked",Toast.LENGTH_LONG).show();
        }
    };

    ClickableSpan[] click_spans = ss.getSpans(start, end,  ClickableSpan.class);

    if(click_spans.length != 0) {
        // remove all click spans
        for (ClickableSpan c_span : click_spans) { …
Run Code Online (Sandbox Code Playgroud)

android android-edittext spannable imagespan

8
推荐指数
2
解决办法
3489
查看次数

如何对TextView中的每个单词进行alpha/translate动画而不是每个单词?

我正在使用以下内容Spannable并且TextView像这样,我已经让它为每个角色制作动画,但我想为每个单词制作动画,我该如何实现?

寻找alpha并翻译每个单词(从每个单词的位置底部).

通过翻译我的意思是翻译(移动)动画.

资源:

private static class FadeyTextView extends TextView
{
    private Interpolator mInterpolator;
    private long mStart, mDurationPerLetter;
    private boolean mAnimating = false;

    private SpannableString mFadeyText;
    private CharSequence mText;


    public FadeyTextView(Context context)
    {
        super(context);
        initView();
    }

    public FadeyTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        initView();
    }

    public FadeyTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        initView();
    }

    private void initView()
    {
        // Set defaults
        mInterpolator = new DecelerateInterpolator();
        mDurationPerLetter = 250;
    }

    public void …
Run Code Online (Sandbox Code Playgroud)

android textview spannablestring spannable

7
推荐指数
0
解决办法
588
查看次数

有什么方法可以在 Android 中聚焦可跨文本以实现可访问性?

我有String多个链接。我正在使用SpannableText,除了可访问性回话外,它工作得很好。

有没有办法让链接可访问?

string android spannable

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