首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TextView:使其截断,而不考虑单词之间的空格

在这个问答内容中,我们讨论了如何在TextView中截断文本,而不考虑单词之间的空格。这里我们将提供一个完善且全面的答案,涵盖与TextView截断相关的知识点。

首先,我们需要了解TextView的基本用法。在Android应用中,TextView是一个用于显示文本的UI组件。我们可以在XML布局文件中使用<TextView>标签来创建一个TextView,并通过android:text属性设置要显示的文本。例如:

代码语言:xml<TextView
复制
    android:id="@+id/my_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello, World!" />

要在TextView中截断文本,我们可以使用android:maxLines属性来限制TextView显示的最大行数,或者使用android:maxLength属性来限制TextView显示的最大字符数。例如:

代码语言:xml<TextView
复制
    android:id="@+id/my_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="2"
    android:text="Hello, World!" />

然而,这种方法并不能直接实现在不考虑单词之间空格的情况下截断文本。为了实现这个需求,我们需要自定义一个TextView类,并重写onMeasure()方法。例如:

代码语言:java
复制
public class CustomTextView extends TextView {
    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int width = getMeasuredWidth();
        int height = getMeasuredHeight();

        // 在这里实现截断文本的逻辑
    }
}

onMeasure()方法中,我们可以使用TextPaint类来计算文本的宽度和高度,并根据需要截断文本。例如:

代码语言:java
复制
public class CustomTextView extends TextView {
    private String originalText;

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int width = getMeasuredWidth();
        int height = getMeasuredHeight();

        TextPaint paint = new TextPaint();
        paint.setTextSize(getTextSize());
        paint.setTypeface(getTypeface());

        originalText = getText().toString();
        String truncatedText = originalText;

        while (paint.measureText(truncatedText) > width) {
            truncatedText = truncatedText.substring(0, truncatedText.length() - 1);
        }

        setText(truncatedText);
    }

    public String getOriginalText() {
        return originalText;
    }
}

在这个自定义TextView中,我们使用了TextPaint类来计算文本的宽度,并使用substring()方法来截断文本。我们还添加了一个getOriginalText()方法来获取原始文本,以便在需要时使用。

总结:在这个问答内容中,我们讨论了如何在TextView中截断文本,而不考虑单词之间的空格。我们提供了一个完善且全面的答案,包括了TextView的基本用法、截断文本的方法以及自定义TextView的实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

微信“ 15。。。。。。。。。”来龙去脉

dVar2这个值为null条件取决于下面这个函数 “i4”变量实际是断句算法返回截断实际位置,dvar2.getLength()实际是当前行文字长度,这里因为断句算法bug,造成了”i4”这个变量一直返回...,因为考虑到标点符号不应该位于行首这条规则,需要将当前行最后一个非标点符号截断到下一行,截断受另外一条规则限制,截断不可以为英文或者数字,这导致15。。。。。。。。。。。...最后返回截断位置为0,并将结果返回,所以才产生了死循环,造成这个bug。 那么问题来了 很多网友也开始讨论,为什么要自己排版,放着好端端系统TextView不用?到底好在哪里?效果是怎么样?...回归正题,我们对系统TextView规则进行对比,最后我们确定了以下几条规则: 1、最多允许有一个字母字符宽度来调整字间距 2、对于标点符号尽量规避不出现在行首 3、对于英文单词或数字截断排版 于是我们开始进行简单...一、小语种处理问题 因为微信对小语种是支持,对于一些特殊小语种,如泰语,阿拉伯语等,泰语排版方式并非简单横排,字符与字符之间是有上下关系,而对于阿拉伯语,是从右往左排列

3.5K40

截断句子

题目 句子 是一个单词列表,列表中单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。...给你一个句子 s​​​​​​ 和一个整数 k​​​​​​ ,请你将 s​​ 截断 ​,​​​使截断句子仅含 前 k​​​​​​ 个单词。 返回 截断 s​​​​​​ 后得到句子。...示例 1: 输入:s = "Hello how are you Contestant", k = 4 输出:"Hello how are you" 解释: s 中单词为 ["Hello", "how"...2: 输入:s = "What is the solution to this problem", k = 4 输出:"What is the solution" 解释: s 中单词为 ["What"...[1, s 中单词数目] s 仅由大小写英文字母和空格组成 s 中单词之间由单个空格隔开 不存在前导或尾随空格 https://leetcode-cn.com/contest/weekly-contest

49330
  • iOS文本布局探讨之一——文本布局框架TextKit浅析

    TextView根据需要显示部分进行Container选择。...需要注意 这个属性设置只是会影响此区块最后一行截断模式 @property(NS_NONATOMIC_IOSONLY) NSLineBreakMode lineBreakMode; //设置每行文本左右空出间距...,如果设置为YES,则会将空格等隐形字符显示出来 */ @property(NS_NONATOMIC_IOSONLY) BOOL showsInvisibleCharacters; //是否显示某些布局控制字符...@property(NS_NONATOMIC_IOSONLY) BOOL showsControlCharacters; //这个属性可以用于设置断字 /* 这个属性取值为0到1之间 默认为0 即单词换行时从来不会中断...越接近1 则使用连字符进行单词换行中断概率越大 */ @property(NS_NONATOMIC_IOSONLY) CGFloat hyphenationFactor; //是否使用字体定义行距

    1.8K10

    CSS自动换行

    word-break:break-all和word-wrap:break-word都是能使其容器如DIV内容自动换行。...它们区别就在于: 1.word-break:break-all 例如div宽200px,它内容就会到200px自动换行,如果该行末端有个英文单词很长(congratulation等),它会把单词截断...2.word-wrap:break-word 例子与上面一样,但区别就是它会把congratulation整个单词看成一个整体,如果该行末端宽度不够显示整个单词,它会自动把整个单词放到下一行,不会把单词截断...速度很慢 fixed : 固定布局算法。在这算法中,水平布局是仅仅基于表格宽度,表格边框宽度,单元格间距,列宽度,和表格内容无关说明:设置或检索表格布局算法。...,这样在FireFox和IE下就都能正确换行,而且要注意,单词空格不能用 来代替,不然不能正确换行。

    2.4K30

    截断句子

    题目 来源:力扣(LeetCode) https://leetcode-cn.com/problems/truncate-sentence 句子 是一个单词列表,列表中单词之间用单个空格隔开,且不存在前导或尾随空格...给你一个句子 s 和一个整数 k ,请你将 s 截断 ,使截断句子仅含 前 k 个单词。返回 截断 s 后得到句子。...[1, s 中单词数目] s 仅由大小写英文字母和空格组成 s 中单词之间由单个空格隔开 不存在前导或尾随空格 解法 利用库函数:s.split(' '), ' '.join(xxx) 从前遍历:...初始化一个空字符串以及统计空格出现次数,遇到空格次数+1,之后就拼接字符串,如果空格次数等于k,则break 从前遍历,定义一个end,表明满足空格次数k后,end位置,直接返回s[:end]即可。..., 因为k 取值范围是 [1, s 中单词数目], 因此不会出现那种k超过单词数目的情况,遍历完了空格数也加一即可 python class Solution: def truncateSentence

    43620

    ☆打卡算法☆LeetCode 68、文本左右对齐 算法解析

    一、题目 1、算法题目 “给定单词数组和一个长度maxWidth,重新排版单词使其成为恰好有maxWWidth个字符,且左右对齐文本。” 题目链接: 来源:力扣(LeetCode) 链接:68....如果某一行单词空格不能均匀分配,则左侧放置空格数要多于右侧空格数。 文本最后一行应为左对齐,且单词之间插入额外空格。 说明: 单词是指由非空格字符组成字符序列。...第二行同样为左对齐,这是因为这行只包含一个单词。 二、解题 1、思路分析 这个题根据题干描述贪心算法,需要确定是每一行放置多少个单词,从而确定单词之间空格个数。...对于填充空格情况可以分为三种: 最后一行:单词左对齐,单词之间应只有一个空格,在行末补充空格 不是最后一行且只有一个单词:该单词左对齐,在行末补充空格 不是最后一行且不只一个单词:将空格均匀分配在单词之间...words 位置 int sumLen = 0; // 统计这一行单词长度之和 // 循环确定当前行可以放多少单词,注意单词之间应至少有一个空格

    86540

    【C++】9道经典面试题带你玩转string类

    如果整数数超过 32 位有符号整数范围 [ , ] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 整数应该被固定为 ,大于 整数应该被固定为 。 返回整数作为最终结果。...(注:字符串末尾不以空格为结尾) 题目详情: 解题思路: 该题我们利用string类成员函数先找到最后一个空格位置,而后用字符串总长度减去最后一个空格位置再减1即为最后一个单词长度...,你需要反转字符串中每个单词字符顺序,同时仍保留空格单词初始顺序。...题目详情: 解题思路: 迭代寻找空格,每当找到空格时候就逆置新空格和旧空格之间单词.直到逆置完最后一个单词,返回逆置后字符串即可....,逆置空格之间单词字符 while (prev_pos <= s.size()) { prev_pos = s.find_first_of("

    7810

    来龙去脉

    “i4”变量实际是断句算法返回截断实际位置,dvar2.getLength()实际是当前行文字长度,这里因为断句算法bug,造成了”i4”这个变量一直返回0,当前行文字长度dvar2.getLength...该函数返回了一个对象a其包含两个参数,一个是断句位置(a.wwk),及断句后文字长度(a.width),主要是因为在判断换行时候,因为考虑到标点符号不应该位于行首这条规则,需要将当前行最后一个非标点符号截断到下一行...,截断受另外一条规则限制,截断不可以为英文或者数字,这导致“15。。。。。。。。。。。。。。。”...最后返回截断位置为0,并将结果返回,所以才产生了死循环,造成这个bug。 4、那么问题来了 很多网友也开始讨论,为什么要自己排版,放着好端端系统TextView不用?到底好在哪里?...回归正题,我们对系统TextView规则进行对比,最后我们确定了以下几条规则: 1、最多允许有一个字母字符宽度来调整字间距; 2、对于标点符号尽量规避不出现在行首; 3、对于英文单词或数字截断排版

    1.9K10

    第一行没排满就自动换行解决办法:word-break:break-all使用

    word-break: break-all 是一个CSS属性,用于控制文本在容器中换行方式。它作用是强制在任意字符之间进行换行,即使这样可能会导致单词被分割。...break-all:强制在任意字符之间进行换行,即使这样可能会导致单词被分割。这个值适用于不考虑单词边界语言,比如中文、日文等。 keep-all:不允许在单词内换行,只能在字符之间换行。...这个值适用于考虑单词边界语言,比如英文。 使用 word-break: break-all 可以在需要时强制换行,即使这样可能会导致单词被分割。...长文章自动换行 对于一篇很长中文文章,如果设置word-break:break-all属性,那么文章中单词或URL就无法自动换行,会使文章阅读体验变得非常差。...,不是截断链接显示省略号。

    89820

    CSS中,如何处理短内容和长内容?

    在许多情况下,添加或删除一个单词会改变 UI 外观,更糟是,它可能会破坏原有的设计,使其无法访问。在我学习 CSS 早期,我低估了添加或删除一个单词作用。...overflow-wrap CSS 属性 overflow-wrap 是用来说明当一个不能被分开字符串太长不能填充其包裹盒时,为防止其溢出,浏览器是否允许这样单词中断换行。...当添加padding时,会导致显示下一行一部分,这本应该要被截断。见下图: image.png 水平滚动 有时候,截断或连接一个单词并不总是可行。...考虑以下 image.png 上面有一个很长单词,它会上容器溢出导致水平滚动。我们可以通过使用overflow-wrap或hyphens来解决这个问题。...在本例中,由于没有在它们之间添加足够间距,产品名称太接近删除按钮。 ?

    1.8K40

    文本左右对齐

    给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词使其成为每行恰好有 maxWidth 个字符,且左右两端对齐文本。...如果某一行单词空格不能均匀分配,则左侧放置空格数要多于右侧空格数。 文本最后一行应为左对齐,且单词之间插入额外空格。 注意: 单词是指由非空格字符组成字符序列。...根据题干描述贪心算法,对于每一行,我们首先确定最多可以放置多少单词,这样可以得到该行空格个数,从而确定该行单词之间空格个数。...;     当前行不是最后一行,且不只一个单词:设当前行单词数为 ,空格数为 ,我们需要将空格均匀分配在单词之间,则单词之间应至少有 个空格,对于多出来空格,应填在前 个单词之间。...因此,前 个单词之间填充 个空格,其余单词之间填充 个空格

    19040

    Leetcode No.68 文本左右对齐(模拟)

    一、题目描述 给定一个单词数组和一个长度 maxWidth,重新排版单词使其成为每行恰好有 maxWidth 个字符,且左右两端对齐文本。...如果某一行单词空格不能均匀分配,则左侧放置空格数要多于右侧空格数。 文本最后一行应为左对齐,且单词之间插入额外空格。 说明: 单词是指由非空格字符组成字符序列。...,这样可以得到该行空格个数,从而确定该行单词之间空格个数。...根据题目中填充空格细节,我们分以下三种情况讨论: 1、当前行是最后一行:单词左对齐,且单词之间应只有一个空格,在行末填充剩余空格; 2、当前行不是最后一行,且只有一个单词:该单词左对齐,在行末填充空格...因此,前 extraSpaces 个单词之间填充avgSpaces+1 个空格,其余单词之间填充 avgSpaces 个空格

    93330

    每日一刷《剑指offer》字符串篇之把字符串转换成整数(atoi)

    31 ,  2****31 − 1] ,需要截断这个整数,使其保持在这个范围内。...然后初始化一个根节点,根节点是空心,即包含任何字符。...添加word:将单词转为字符数组,从根节点出发,遍历输入单词,如果子节点包含当前字符,则新建对应子节点,如果包含,则跳到对应子节点,同时访问次数加一。单词遍历完成后,当前节点标识改为true。...查询word:将单词转为字符数组,从根节点出发,遍历输入单词,如果子节点包含当前字符,说明不存在该单词,返回false,如果包含,就往子节点方向移动。遍历完成后,标识为true,说明存在该单词。...查询以pre为前缀单词数量:将单词转为字符数组,从根节点出发,遍历输入单词,如果子节点包含当前字符,说明不存在该前缀,返回0,如果包含,就往子节点方向移动。

    18820

    68. 文本左右对齐

    给定一个单词数组和一个长度 maxWidth,重新排版单词使其成为每行恰好有 maxWidth 个字符,且左右两端对齐文本。...你应该使用“贪心算法”来放置给定单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ‘ ‘ 填充,使得每行恰好有 maxWidth 个字符。 要求尽可能均匀分配单词空格数量。...如果某一行单词空格不能均匀分配,则左侧放置空格数要多于右侧空格数。 文本最后一行应为左对齐,且单词之间插入额外空格。 说明: 单词是指由非空格字符组成字符序列。...每个单词长度大于 0,小于等于 maxWidth。 输入单词数组 words 至少包含一个单词。..."shall be " 不是 "shall be", 因为最后一行应为左对齐,不是左右两端对齐。

    98920

    从这道字符串处理难题,寻找解决复杂问题套路

    每一行对于单词数量没有限制,可以是一个,也可以是多个。如果一行当中单词数量超过1,那么需要在单词之间摆放空格。...要求单词之间空格尽可能均匀,如果不可能保证每个空隙空格数量完全相等,那么要保证前面的空格数量大于等于后面。 文本最后一行要求进行左对齐,也就是说单词全部靠左摆放,单词之间只有一个空格。...单词之间被填充了空格,单个成行以及最后一行按照左对齐方式摆放,也就是所有的空格都在右侧。 解法 这题解法很明显了,就是题目的意思本身。...第一个流程是切分,也就是单词切分,哪些单词成为一行。第二个流程是填充,也就是在单词之间填充上合适空格数量,使其符合题意。 我们怎么判断这一行究竟要包含几个单词?...其实代码当中函数起到就是一个小模块作用,一个复杂功能也正是这些互相之间彼此独立小模块组合而成

    43030

    TextView属性和方法大全

    一、认识TextView 我们知道前面学习HelloWorld应用程序中就是使用TextView来显示一个文本,接下来首先一起来学习TextView使用方法。...该属性支持如下属性值: none:转换 sentence:每个句子首字母大写 words:每个单词首字母大写 characters:每个字母都大写 android:cursorVisible SetCursorVisible...该属性支持如下属性值: none:不做任何处理 start:在文本开始处截断,并显示省略号 middle:在文本中间处截断,并显示省略号 end:在文本结尾处截断,并显示省略号 marquee:使用marquee...该属性支持大量属性值,不同属性值用于指定特定输入框 android:lineSpacingExtra setLineSpacing(float, float) 控制两行文本之间额外间距。...android:lineSpacingMultiplier属性结合使用 android:lineSpacingMultiplier setLineSpacing(float, float) 控制两行文本之间额外间距

    2.1K50

    LeetCode 68. 文本左右对齐(字符串逻辑题)

    题目 给定一个单词数组和一个长度 maxWidth,重新排版单词使其成为每行恰好有 maxWidth 个字符,且左右两端对齐文本。...你应该使用“贪心算法”来放置给定单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。 要求尽可能均匀分配单词空格数量。...如果某一行单词空格不能均匀分配,则左侧放置空格数要多于右侧空格数。 文本最后一行应为左对齐,且单词之间插入额外空格。 说明: 单词是指由非空格字符组成字符序列。...每个单词长度大于 0,小于等于 maxWidth。 输入单词数组 words 至少包含一个单词。..."shall be " 不是 "shall be", 因为最后一行应为左对齐,不是左右两端对齐。

    76010
    领券