Android 关于在PagerView中TextView的内容多行高度以最多行的形式显示

简介:

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

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

其布局文件代码为

1
2
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"

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

1
2
3
4
<android.support.v4.view.PagerTitleStrip
       android:id="@+id/pager_title_strip"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"

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

1
android:singleLine="false"

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

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

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

首先,我想到了在代码中动态去获取每页标题自动换行后的高度,即

1
int  currentHeight = tvTitle.getLineCount() * tvTitle.getLineHeight();

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

1
tvTitle.setHeight(maxHeight);

将其设置。

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

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


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

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

因为标题内容可能有汉字,字符,数字和其他符号,所以我们必须都要考虑在内。这里用到一个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//通过计算得出字符串像素大小
     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一行的像素值,这块我真没力气去深入研究了,包括字间距什么的,我开始本以为要加,但是经过实际操作,发现那些都是多余。

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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();
             }

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










本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1285357,如需转载请自行联系原作者

目录
相关文章
|
13天前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
52 3
|
3月前
|
XML IDE 开发工具
13. 【Android教程】文本框 TextView
13. 【Android教程】文本框 TextView
66 2
|
3月前
|
编解码 Android开发
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
42 0
|
4月前
|
Android开发
android TextView HTML 的效果
android TextView HTML 的效果
33 2
|
4月前
|
XML 搜索推荐 Java
Android TextView的字体设置
【5月更文挑战第13天】
150 0
|
4月前
|
XML Java Android开发
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
417 1
|
4月前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
83 0
|
Java Android开发 iOS开发
Android TextView 与 EditText 的区别与使用
Android TextView 与 EditText 的区别与使用
137 0
|
XML Android开发 数据格式
Android 中使用SpannableString实现TextView文本超链接跳转功能
Android 中使用SpannableString实现TextView文本超链接跳转功能
202 0
|
Android开发
Android 实现视图文本TextView的展开与收缩功能
Android 实现视图文本TextView的展开与收缩功能
268 0