如何使长 TextView 的一部分在屏幕上可见?

3
我有一个包含大量文本的TextView,但是屏幕上只有一部分文本是可见的。现在我想(以编程方式)强制用户查看某些文本内容。例如,我的文本如下:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut id ante tellus. Nulla facilisi. Sed gravida fringilla velit, non sollicitudin tellus egestas non. Cras congue, nulla id bibendum tempus, dui dui blandit elit, elementum dictum dolor eros et mi. Nullam leo tellus, aliquet vel tincidunt sed, suscipit nec dui. Nunc dapibus, odio vestibulum hendrerit vestibulum, lorem orci dictum arcu, quis porttitor lorem libero sit amet odio. Sed imperdiet viverra diam, eu porttitor ipsum fringilla et. Suspendisse consectetur sapien ac felis tincidunt dictum. Suspendisse ultrices porta dignissim. Maecenas in nibh sed nisi facilisis dignissim non ut tortor. Pellentesque eleifend tempus sem, sit amet mattis arcu auctor id. Vivamus at tortor rutrum diam vestibulum adipiscing. Suspendisse potenti. Integer sollicitudin laoreet enim ac suscipit. Quisque convallis facilisis pharetra.
我想要强制让粗体单词(例如上例中的“tortor”)可见给用户(也许通过垂直滚动TextView并设置正确的值)。是否有任何方法来实现这一点?注意,我不想使这个单词变粗体!

据我所见,您无法使用标准的 TextView 来完成此操作。虽然有一个 getLineBounds 方法可以返回给定行基线的 Y 坐标,但我没有看到确定哪一行包含特定字符串的方法。 - quietmint
3个回答

1

以下是一种滚动到特定单词的方法:

public void scrollToWord(String string) {
    TextView textView = (TextView) findViewById(R.id.text1);
    String text = textView.getText().toString();

    // Find the first occurrence of the word 
    int position = text.indexOf(string);
    // Calculate how far in the word is: 30%, 40%, 73% 
    int percent = (int) (position / (double) text.length() * 100);
    // Calculate how far to scroll
    int y = textView.getHeight() * percent;

    // Finally scroll
    ((ScrollView) textView.getParent()).scrollTo(0, y);
}

我对此有两点说明:

  1. 这只会滚动到第一个匹配项,但很容易更改为 String.indexOf(string, start) 并找到第二个、第三个等等。

  2. 如果你想在应用程序启动后立即滚动到此位置,你必须等到 onResume() 完成后才能执行。但是没有相应的方法... 我建议使用 Handler,如果需要,我可以帮助你。

希望这有所帮助!


谢谢,我喜欢你的回答和两个注释。但是,显然你的答案并不完全准确(你知道,因为我的字体中字符宽度不同,还取决于文本和单词等因素)。 - yrajabi
这只是一个近似值,而不是精确的测量。我不知道任何准确计算单词位置的方法,因为像你这样的字体、不同大小的屏幕等原因。但这个近似值不应该产生太大的偏差,你应该有一个很大的缓冲区来处理(比如说10% - 30%),具体取决于字体、视野范围和文本长度。所以,除非你试图在一个TextView中显示一本书,否则不用担心。(如果你试图显示大量文本,请考虑使用带有HTML链接和JavaScript的WebView。) - Sam

1

这可能需要一些努力,但使用android.graphics.Paint#measureText(...)或者breakText(...)函数,可以计算出需要滚动多少才能使所需单词可见。您需要考虑字体、字号、显示文本的视图大小等因素。


0

您可以使用带有加粗选项的HTML标签来使特定单词加粗。


1
我认为yrajabi的意思是如何使该单词可见,即将其滚动到视图中。 - Ridcully
@程序员 我不想将特定单词加粗!我只想让用户看得见它。 - yrajabi
@Ridcully 是的,你说得对。我想让TextView在一个位置滚动,使得特定的单词对用户可见。 - yrajabi
@yrajabi - 请查看此问题的答案:https://dev59.com/43A75IYBdhLWcg3wB0VP - Ridcully

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接