是否可以为TextView中的不同文本设置多个样式?
例如,我将文本设置如下:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
Run Code Online (Sandbox Code Playgroud)
是否可以为每个文本元素设置不同的样式?例如,line1粗体,word1斜体等.
开发人员指南的常见任务和Android中的操作方法包括选择,突出显示或设置部分文本样式:
Run Code Online (Sandbox Code Playgroud)// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // …
是否可以在TextView中设置文本范围的颜色?
我想做一些类似于Twitter应用程序的东西,其中一部分文本是蓝色的.见下图:

Android提供了多种接口所有文字和字符串相关的:
Spanned,SpannedString,Spannable,SpannableString和CharSequence.
我已经在各种场景中使用了上述所有内容,通常是在使用Html.fromHtml()内部显示可链接文本之后TextView,以便为其应用一些样式.
我试图从Android的官方文档中了解这些接口的用途/用法并且因为它很混乱而失败了.这些接口的目的是什么?在哪些情况下使用它们最常见?在哪些情况下最好避免使用它们?使用其中任何一个时,是否有任何明显的性能影响?
如果有人能提供一个体面的解释,我将不胜感激.
领先保证金的含义是什么?
文件LeadingMarginSpan 说
影响前导边距的段落样式.单个段落可以有多个主要边距跨度; 它们将按顺序呈现,每个都将其边距添加到它之前的边距.右边到左边的段落中的前导边距位于右边.
但它并没有真正说明领先优势是什么.
它是否像段落第一行的制表符缩进?或者它是整个段落缩进的地方?我认为它是/lidɪŋ/而不是/lɛdɪŋ/就像在行之间的空间一样.
我想知道的原因是我正在尝试使用StaticLayout创建自己的TextView.我指的是想法的Layout和StaticLayout 源代码.我试图删除所有不必要的部分,但我不知道这是什么.
以下是一些SO问题,也询问领先优势,但问题似乎知道这意味着什么.
图像确实很有用,但并非绝对必要.
我的意思是:
<string name="error" color="#9a1d1d">Error!</string>
Run Code Online (Sandbox Code Playgroud) 有人可以解释这个错误吗?
"SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length".
我认为这与它有关editText.有解决方案吗?
这是我的日志.
1-07 14:29:47.654: D/OpenGLRenderer(24479): Enabling debug mode 0
01-07 14:30:36.954: E/SensorManager(24479): thread start
01-07 14:30:36.959: D/SensorManager(24479): registerListener :: handle = 0 name= LSM330DLC 3-axis Accelerometer delay= 200000 Listener=
android.view.OrientationEventListener$SensorEventListenerImpl@43000e98
01-07 14:30:37.139: E/SpannableStringBuilder(24479): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
01-07 14:30:37.139: E/SpannableStringBuilder(24479): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
01-07 14:30:37.419: I/Process(24479): Sending signal. PID: 24479 SIG: 9
01-07 14:30:37.654: E/Trace(25014): error opening trace file: No such file …Run Code Online (Sandbox Code Playgroud) 有人能为Android的Spanned Java界面中的标志提供清晰的解释吗? 文档不清楚,我需要更多细节,就像在这个SO答案中解释其他标志一样.
请求以下标志的定义:
SPAN_COMPOSING
SPAN_INTERMEDIATE
SPAN_POINT_MARK_MASK
SPAN_PRIORITY
SPAN_USER
SPAN_USER_SHIFT
Run Code Online (Sandbox Code Playgroud) 我的应用程序使用unicode字符\ u2192在TextView元素中显示右箭头.但是,箭头显示在最底部,但应垂直居中:
但是,如果我使用标准输出打印unicode字符,一切都很好:
public class Main {
public static void main(String[] args) {
System.out.println("A" + Character.toString("\u2192".toCharArray()[0]));
}
}
Run Code Online (Sandbox Code Playgroud)
我如何强制使用右箭头在TextView中居中?我的TextView已经使用了android:gravity="center_vertical|left".
更新:我使用的是Android Studio 3.0.1和Android SDK 26. TextView的XML代码:
<TextView
android:id="@+id/my_text_view"
android:layout_width="match_parent"
android:fontFamily="monospace"
android:gravity="center_vertical|left"
android:textSize="26sp" />
Run Code Online (Sandbox Code Playgroud)
在代码中填充TextView:
TextView textView = findViewById(R.id.my_text_view);
textView.setText("A" + Character.toString("\u2192".toCharArray()[0]) + "B");
Run Code Online (Sandbox Code Playgroud) 当用户撰写时,如何在 EditText 文本上应用跨度?
例如,用户在撰写时激活了“粗体”,因此此后输入的每个字符都应该是粗体。
我考虑过向 EditText 添加文本更改侦听器并在用户撰写时更新文本,但我想知道是否有更好的方法来执行此操作。
我想在 a 中获取一种类型的所有跨度CharSequence并将它们转换为不同的类型。例如,将所有粗体跨度转换为下划线跨度:
我该怎么做?
(这是我今天面临的一个问题,既然我现在已经解决了,我在这里添加一个问答对。我的答案如下。)