您的位置:首页 > 移动开发 > Android开发

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

2013-08-29 16:32 288 查看
标题的内容可能写的有点让人晕~下面我来解释下,实际上是这么回事

PagerView是官方提供的可以呈现滑屏效果的控件
其布局文件代码为
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
而其也提供了一个标题的布局,
<android.support.v4.view.PagerTitleStrip
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();
}
最后再加上这一段,算是把这个问题暂时告一段落了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android ViewPager Te
相关文章推荐