支持库(此处为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文件中.
我正在尝试使用一个简单的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) 我有来自外部源的字符串,其中包含以下格式的 HTML 标记:“你好,我是 <b> 粗体</b> 文本”
在 Compose 之前,我会在 HTML 字符串的开头使用 CDATA,使用 Html.fromHtml() 转换为 Spanned 并将其传递给 TextView。TextView 会将粗体字加粗。
我试图用 Compose 复制这个,但我找不到让我成功实现它的确切步骤。
任何建议都非常感谢。
我正在设置Span文本的一部分.跨度本身运作良好.然而,文本是由String.formatfrom 创建的Resources,我不知道,start并且end我将要将Span设置为文本的一部分.
我tryed使用自定义HTML代码strings.xml,但无论是getText或getString删除它们.我可以用这样的事情getString(R.string.text, "<nb>" + arg + "</nb>"),那么Html.fromHtml(),因为arg正是在这里我想设置的跨度.
我看到这种使用文本格式化的方法"normal text ##span here## normal text".它解析字符串删除标签并设置Span.
我的问题是,是否有更好的方法来完成将Span设置为格式化字符串,"something %s something"或者我应该使用上述方法之一?
我正在构建一个简单的聊天应用程序,用户可以在其中发送文本和表情符号.我可以将文字和表情符号发送到另一部手机.我的问题是:
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) 我有一段代码,使用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.
我为spannableText设置了span并将其设置为TextView.在我想要获得此文本的宽度和高度之后.但是结果没有考虑由于设定的跨度而导致的文本大小的变化.下一个解决方案是错误的.
return textView.getPaint().measureText(text, 0, text.length());
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,用户从库中选择一个图像,它将添加到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) 我正在使用以下内容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) 我有String多个链接。我正在使用SpannableText,除了可访问性回话外,它工作得很好。
有没有办法让链接可访问?