androi自定义自动换行的View(类似网页的标签Tag)
看来只有礼拜天才有时间写点博客啊,平时只能埋头苦干了。今天在公司加班,遇到一个需求,就是自动换行的TextView,有点像网页的tag标签,点击一下,就自动加上去了,不过这个是根据后台拿来的数据来显示多少个View,在网上找找,看见了许多,我自己也封装写一个吧,以便以后需要...开工
| 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | packagecom.woyou.ui.component;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.TextView;importcom.citaq.ideliver.R;/** * 自动换行的View *  * @author shenzhou 2015年1月11日 */publicclassWordWrapView extendsViewGroup {    privatestaticfinalintPADDING_HOR = 10;// 水平方向padding    privatestaticfinalintPADDING_VERTICAL = 15;// 垂直方向padding    privatestaticfinalintSIDE_MARGIN = 10;// 左右间距    privatestaticfinalintTEXT_MARGIN = 10;    publicWordWrapView(Context context) {        super(context);    }    publicWordWrapView(Context context, AttributeSet attrs) {        super(context, attrs);    }    publicWordWrapView(Context context, AttributeSet attrs, intdefStyle) {        super(context, attrs, defStyle);    }    @Override    protectedvoidonLayout(booleanchanged, intl, intt, intr, intb) {        intchildCount = getChildCount();        intautualWidth = r - l;        intx = SIDE_MARGIN;// 横坐标开始        inty = 0;// 纵坐标开始        introws = 1;        for(inti = 0; i < childCount; i++) {            View view = getChildAt(i);            view.setBackgroundResource(R.drawable.shopdetail_keytag_bg);            intwidth = view.getMeasuredWidth();            intheight = view.getMeasuredHeight();            x += width + TEXT_MARGIN;            if(x > autualWidth) {                x = width + SIDE_MARGIN;                rows++;            }            y = rows * (height + TEXT_MARGIN);            if(i == 0) {                view.layout(x - width - TEXT_MARGIN, y - height, x                        - TEXT_MARGIN, y);            } else{                view.layout(x - width, y - height, x, y);            }        }    }    @Override    protectedvoidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {        intx = 0;// 横坐标        inty = 0;// 纵坐标        introws = 1;// 总行数        intspecWidth = MeasureSpec.getSize(widthMeasureSpec);        intactualWidth = specWidth - SIDE_MARGIN * 2;// 实际宽度        intchildCount = getChildCount();        for(intindex = 0; index < childCount; index++) {            View child = (TextView) getChildAt(index);            child.setPadding(PADDING_HOR, PADDING_VERTICAL, PADDING_HOR,                    PADDING_VERTICAL);            child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);            intwidth = child.getMeasuredWidth();            intheight = child.getMeasuredHeight();            x += width + TEXT_MARGIN;            if(x > actualWidth) {// 换行                x = width;                rows++;            }            y = rows * (height + TEXT_MARGIN);        }        setMeasuredDimension(actualWidth, y);    }} | 
具体使用:
我的项目的布局文件太长了,我就说了
| 1 | <com.woyou.ui.component.wordwrapview style="@style/shopDetailTextStyle"android:id="@+id/shopdetail_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:paddingleft="@dimen/dp20"android:paddingright="@dimen/dp20"android:paddingtop="@dimen/dp10"></com.woyou.ui.component.wordwrapview> | 
把这段布局文件加到你要把文字自动换行的地方。java文件中的使用:
| 1 2 3 4 5 6 7 8 9 10 11 | if( !TextUtils.isEmpty(shopDetail.getInfo()) ) {                    infoLin.setVisibility(View.VISIBLE);                    //店铺关键字                    String key = shopDetail.getKey();                    strs = key.split("\\|");                    for(inti = 0; i < strs.length; i++) {                          TextView textview = newTextView(mActivity);                          textview.setText(strs[i]);                          wordWrapView.addView(textview);                    }                    LogUtil.i(TAG, "tags:"+ strs.toString()); | 
前面还有找到控件什么的,我相信大家都是知道的。这只是核心代码,效果图如下:

<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjwvcD4KPHA+KioqKioqKioqKioqKioqKioqKioqKr3pydzB7c3i0rvW1re9t6ijrMrHxLO49rTzyfHQtLXEo6yyu7n9w7u34tewo6y5qbTzvNKyzr+8KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3A+CjxwPioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;"> /** 标签之间的间距 px */ private final int itemMargins = (int) getContext().getResources().getDimension(R.dimen.dp15); /** 标签的行间距 px */ private final int lineMargins = (int) getContext().getResources().getDimension(R.dimen.dp10);
| 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | /**     * 加载店铺关键字     * @param tags     */    privatevoidloadShopKeys (String[] tags) {        if( tags == null)            return;        finalintcontainerWidth = container.getMeasuredWidth() - container.getPaddingRight()  - container.getPaddingLeft();          finalLayoutInflater inflater = mActivity.getLayoutInflater();          /** 用来测量字符的宽度 */        finalPaint paint = newPaint();          finalTextView textView = (TextView) inflater.inflate(R.layout.item_textviewtag_lv, null);          finalintitemPadding = textView.getCompoundPaddingLeft() + textView.getCompoundPaddingRight();          finalLinearLayout.LayoutParams tvParams = newLinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);          tvParams.setMargins(0, 0, itemMargins, 0);          paint.setTextSize(textView.getTextSize());          LinearLayout layout = newLinearLayout(getContext());          layout.setLayoutParams(newLinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));          layout.setOrientation(LinearLayout.HORIZONTAL);          container.addView(layout);          finalLinearLayout.LayoutParams params = newLinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);          params.setMargins(0, lineMargins, 0, 0);          /** 一行剩下的空间 **/        intremainWidth = containerWidth;          for(inti = 0; i < tags.length; ++i) {              finalString text = tags[i];              finalfloatitemWidth = paint.measureText(text) + itemPadding;              if(remainWidth > itemWidth) {                  addItemView(inflater, layout, tvParams, text);              } else{                  resetTextViewMarginsRight(layout);                  layout = newLinearLayout(getContext());                  layout.setLayoutParams(params);                  layout.setOrientation(LinearLayout.HORIZONTAL);                  /** 将前面那一个textview加入新的一行 */                addItemView(inflater, layout, tvParams, text);                  container.addView(layout);                  remainWidth = containerWidth;              }              remainWidth = (int) (remainWidth - itemWidth + 0.5f) - itemMargins;          }          resetTextViewMarginsRight(layout);      }          /***************** 将每行最后一个textview的MarginsRight去掉 *********************************/    privatevoidresetTextViewMarginsRight(ViewGroup viewGroup) {          finalTextView tempTx = (TextView) viewGroup.getChildAt(viewGroup.getChildCount() - 1);          tempTx.setLayoutParams(newLinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));      }        privatevoidaddItemView(LayoutInflater inflater, ViewGroup viewGroup, android.widget.LinearLayout.LayoutParams tvParams, String text) {          finalTextView itemTx = (TextView) inflater.inflate(R.layout.item_textviewtag_lv, null);          itemTx.setText(text);          viewGroup.addView(itemTx, tvParams);      }   | 
推推族,免费得门票,游景区:www.tuituizu.com
结伴旅游,一个免费的交友网站:www.jieberu.com
androi自定义自动换行的View(类似网页的标签Tag)的更多相关文章
- C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权
		通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转. 但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作. 举一个简 ... 
- 自定义控制器的View(loadView)及其注意点
		*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ... 
- 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!
		一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ... 
- android 开发 View _14  MotionEvent和事件处理详解,与实践自定义滑动条View
		转载https://blog.csdn.net/huaxun66/article/details/52352469 MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列 ... 
- android显示通知栏Notification以及自定义Notification的View
		遇到的最大的问题是监听不到用户清除通知栏的广播.所以是不能监听到的. 自定义通知栏的View,然后service运行时更改notification的信息. /** * Show a notificat ... 
- 浅析网页meta标签中X-UA-Compatible属性的使用
		今天有一个做开发的朋友突然问你知道很多网站上面加入的X-UA-Compatible属性的意义么?其实这个在以前还专门花了一点时间来验证我自己的想法,结果也确实如自己所预想的那样,八九不离十,当然有一点 ... 
- php实现网页HTML标签补全方法
		如果你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包含进去了,我们可以写个函数方法来补全html标签以及过滤掉无用的html标签. php ... 
- 一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)
		一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量ke ... 
- JSTL核心标签库——重定向标签、URL处理标签、网页导入标签
		<c:redirect>重定向标签 相当于HttpServletResponse的sendRedirect()方法. <%@page contentType="text/h ... 
随机推荐
- hbase部署
			Hbase: 更细的操作和原理研究笔记和视频 cloudera Hbase:https://sysit.cn/blog/post/sysit/cloudera%E5%AE%89%E8%A3%85HBA ... 
- 【转】mysql用sql实现split函数
			关键词:mysql split mysql根据逗号将一行数据拆分成多行数据1.原始数据演示 2.处理结果演示 3.sql语句 SELECT a.id , a.NAME , substring_inde ... 
- Node.js 博客搭建
			Node.js 博客搭建:https://www.linuxidc.com/Linux/2017-02/140115.htm https://www.cnblogs.com/mrcln/p/93087 ... 
- setter 和 getter 高级 以及内存管理初级
			setter 和 getter 的演变,紧接setter 和 getter 初级 1.@property 和 @synthesize 这两个关键字的出现,就是为了剔除代码中的setter方法和get ... 
- DataFrame.to_dict(orient='dict')
			DataFrame.to_dict(orient=’dict’) >>> df = pd.DataFrame({'name':[1,2,3],"class":[1 ... 
- java复习(1)
			这几天开学,很多知识点还很生疏,这两天先把java基础复习一下,有段时间没有写博客了,今天就先谈谈进制转换吧. 1.二进制数的原码,补码和反码 1):对于正数的原码,补码和反码均是相同的,这里不讨论了 ... 
- 国际化:node导语言包
			项目做国际化,是离不开语言包的en.json.zh-CN.json等等.难道要一个一个json文件的写吗???不!!!只要我们写在excel里,然后用nodejs导出我们需要的语言包就可以了!这样大大 ... 
- MySQL第三讲  一一一一  视图、触发器、函数、存储过程
			1. 视图 1.1 视图前戏 我们之前讲有,临时表的概念. 现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 1 ... 
- Ant 学习
			到了新公司,发现公司使用ant 来代码生成.本来学习后写下来.在网上找到一篇教程,实在是非常给力... 就把连接记下来吧:http://www.blogjava.net/amigoxie/archiv ... 
- 009-通过jmx监控tomcat
			前言想理解怎么监控tomcat,必需识下图(图片源出网络) zabbix-Web前端界面,它通过数据库里数据展示.和其它组件不直接关联zabbix-server运行在10051端口,Zabbix-se ... 
