android textview 设置多行显示,Android 关于在PagerView中TextView的内容多行高度以最多行的形式显示...

标题的内容可能写的有点让人晕~下面我来解释下,实际上是这么回事

PagerView是官方提供的可以呈现滑屏效果的控件

其布局文件代码为

xmlns:tools="http://schemas.android.com/tools"

而其也提供了一个标题的布局,

android:id="@+id/pager_title_strip"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

但是这个标题有一个限制,就是没法多行显示,如果想做出一个类似调查问卷的东西,带有滑屏效果的话,标题可想而知一定是问卷的问题,所以这种情况下是必须把标题全部显示出来的,所以大家自然而然的就能想到用TextView去替代官方提供的这个PagerTitleStrip。所以问题就很容易解决,只要在TextView中添加

android:singleLine="false"

这个属性就能使标题自动换行,看似问题已经解决了。当然,如果需求就是做到如此的话,那还是不错,至少简单轻松达到目的。

但是如果接下来这样的需求,为了滑屏的时候页与页之间衔接的美观一些(想想,如果第一页的标题内容能自动换成3行,而第二页的内容自动换成2行,这种情况下就会出现页与页之间标题下面的内容不在一个水平线上的情况),那么是不是就应该使用每页的标题都能有同一高度,这样就好了呢?

的确如此,这就是我标题所想阐述的,不过这样的情况我相信极极极极少人会遇到的,如果你遇到了,可以考虑用下面的方法

首先,我想到了在代码中动态去获取每页标题自动换行后的高度,即int currentHeight = tvTitle.getLineCount() * tvTitle.getLineHeight();

这样一段代码去实现,然后遍历每页的标题高度,取出值最大,也就是最高的一个然后tvTitle.setHeight(maxHeight);

将其设置。

但是这么做有两个问题,1,因为整个视图的创建我是在Fragment类的onCreateView()方法里实现的,导致tvTitle.getLineCount()始终是0,因为这个方法是只有在视图成功创建之后才能获取到真实值,否则就会返回0,这已经是一个无法逾越的鸿沟了。

但是还有第二个问题,2,我上面提到的遍历每页的高度,那真是扯蛋,但是我当时以为是可以的,如果你去查看Fragment类里的视图生命周期或者在onCreateView()里加些打印信息,你就会发现除非你自己去滑动页面,否则系统根本不会去“触碰”那些没有呈现的页,所以此方法不可行。

但是问题是必须要解决的,而且从来没有解决不了的问题。所以出现了第二种方法。

因为标题的内容是已知的,所以我们可以算出每页标题的像素(pixels)总大小,然后选择一个最大的,再通过计算TextView一行所显示的像素大小,两者进行相除,就能算出是多少行。我想我目前也只能做到这个程度了。

因为标题内容可能有汉字,字符,数字和其他符号,所以我们必须都要考虑在内。这里用到一个函数//通过计算得出字符串像素大小

public int getPixels(String parseStr){

if (parseStr == null || parseStr.length() <= 0) {

return 0;

}

int pixelsLength = 0;

char c;

for (int i = parseStr.length()-1; i >= 0; i--) {

c = parseStr.charAt(i);

if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {

//字母, 数字

pixelsLength++;

}

else {

if (Character.isLetter(c)) {

//中文

pixelsLength += 2;

}

else {

//符号或控制字符

pixelsLength++;

}

}

}

pixelsLength = (int)pixelsLength/2;

return pixelsLength;

}

其中后面有一段pixelsLength/2的内容,因为我发现当计算出的长度/2以后,才是真正TextView一行的像素值,这块我真没力气去深入研究了,包括字间距什么的,我开始本以为要加,但是经过实际操作,发现那些都是多余。

所以就按照我的方法来吧。

try{

//得到TextView的像素大小(pixels),即单行所有像素大小

int titleWidth = screenWidth - tvTitle.getPaddingLeft() - tvTitle.getPaddingRight();

//单行能放多少个像素单元

int singleLineLength = (int)(titleWidth/(int)tvTitle.getTextSize());

//总的像素大小/单行像素大小=需要多少行

int lineNum = titleLength/singleLineLength;

if (lineNum == 0){

lineNum = 1;

}

if (lineNum != 0){

lineNum++;

}

//设置TextView的高度

tvTitle.setHeight(lineNum*tvTitle.getLineHeight()+5);

}catch(Exception e){

e.printStackTrace();

}

最后再加上这一段,算是把这个问题暂时告一段落了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用AndroidTextView控件来实现显示多行文本且每行字数不超过7个的效果。你可以按照以下步骤进行操作: 1. 在XML布局文件,添加一个TextView控件: ```xml <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="3" android:ellipsize="end" android:textSize="16sp" /> ``` 在上面的代码,`maxLines`属性设置为3表示最多显示3行文本,`ellipsize`属性设置为`end`表示超出最大行数时末尾使用省略号,`textSize`属性设置为16sp表示文字大小为16sp。 2. 在Java代码,获取TextView控件的实例并设置文本内容: ```java TextView textView = findViewById(R.id.textView); String text = "This is a long text that needs to be displayed in multiple lines with a maximum of 7 characters per line."; String formattedText = formatText(text, 7); // 格式化文本,每行最多显示7个字符 textView.setText(formattedText); ``` 在上面的代码,`formatText`方法用于格式化文本,将每行的字符数限制在最大值7个。 3. 添加一个辅助方法`formatText`来格式化文本: ```java private String formatText(String text, int maxCharsPerLine) { StringBuilder formattedText = new StringBuilder(); int index = 0; while (index < text.length()) { if (index + maxCharsPerLine < text.length()) { formattedText.append(text.substring(index, index + maxCharsPerLine)).append("\n"); index += maxCharsPerLine; } else { formattedText.append(text.substring(index)); break; } } return formattedText.toString(); } ``` 在上面的代码,使用`StringBuilder`来逐行拼接文本,通过循环将每行的字符数限制在最大值7个。 这样,TextView就会显示多行文本,且每行字数不超过7个。注意,如果文本本身就包含换行符,可能会影响到显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值