package com.test.testview;

 import java.util.ArrayList;

 import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView; import com.test.testview.R; public class HotwordsViewgroup extends LinearLayout implements
View.OnClickListener
{
private final static int VIEW_MARGIN_HORIZONTAL = 50;
private final static int VIEW_MARGIN_VERTICAL = 20; private HotwordsOnclickListener mHotwordsOnclickListener; public static interface HotwordsOnclickListener
{
/**
* 触发onclik回调,根据TextView.getText去做相关事情
*
* @param view
*/
public void hotwordOnclick(TextView view);
} public HotwordsViewgroup(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
} public HotwordsViewgroup(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
} public HotwordsViewgroup(Context context)
{
super(context);
init();
} /**
* 设置每个关键词点击事件监听
*
* @param listener
*/
public void setHotwordOnclickListener(HotwordsOnclickListener listener) {
mHotwordsOnclickListener = listener;
} private void init() {
setOrientation(HORIZONTAL);
} public void setData(final ArrayList<String> list) {
removeAllViews();
if (list != null) {
for (int i = 0; i < list.size(); i++) {
String content = list.get(i);
if (TextUtils.isEmpty(content)) {
continue;
}
TextView textview = new TextView(getContext());
textview.setTextColor(Color.WHITE);
textview.setBackgroundResource(R.drawable.hot_words_bg);
textview.setTextSize(18);
textview.setOnClickListener(this);
textview.setMinimumWidth(100);
textview.setSingleLine();
textview.setEllipsize(TextUtils.TruncateAt.END);
textview.setText(content);
LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
addView(textview, layoutparams);
}
}
} /**
* 重写onLayout,在layout每个元素之前,需要计算该元素是否需要折行到下一行显示
*/
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int count = getChildCount();
if (count == 0) {
super.onLayout(changed, l, count, r, b);
return;
}
int lengthX = 0;
int lengthY = 0;
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
int width = child.getMeasuredWidth();
int height = child.getMeasuredHeight();
child.layout(lengthX, lengthY, lengthX + width, lengthY + height);
int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
int nextWidth = 0;
if (i < count - 1) {
nextWidth = getChildAt(i + 1).getMeasuredWidth();
}
if (right + nextWidth > (r - l)) {
lengthX = 0;
lengthY += height + VIEW_MARGIN_VERTICAL;
} else {
lengthX = right;
}
}
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int count = getChildCount();
if (count == 0) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int lengthX = 0;
int lengthY = 0;
int r = MeasureSpec.getSize(widthMeasureSpec);
// 定义子View的宽度最大不能超过r宽度
int childWidth = MeasureSpec.makeMeasureSpec(r, MeasureSpec.AT_MOST);
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(childWidth, MeasureSpec.UNSPECIFIED);
int width = child.getMeasuredWidth();
int height = child.getMeasuredHeight();
int right = lengthX + width + VIEW_MARGIN_HORIZONTAL;
int nextWidth = 0;
// 非最后一个元素需要尝试计算一下能否放的下
if (i < count - 1) {
nextWidth = getChildAt(i + 1).getMeasuredWidth();
} else {
// 最后一个计算高度的时候要加最后一排的高度
lengthY += height;
}
if (right + nextWidth > r) {
// 如果放不下,换行
lengthX = 0;
lengthY += height + VIEW_MARGIN_VERTICAL;
} else {
// 如果能放下,往后加
lengthX = right;
}
}
setMeasuredDimension(
widthMeasureSpec,
MeasureSpec.makeMeasureSpec(lengthY,
MeasureSpec.getMode(heightMeasureSpec)));
} @Override
public void onClick(View view) {
if (mHotwordsOnclickListener != null) {
mHotwordsOnclickListener.hotwordOnclick((TextView) view);
}
}
}

Android自动折行TextView Group的更多相关文章

  1. UIlabel多行文字自动换行 (自动折行)

    UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(, , , )]; UILabel *label = [[UILabel al ...

  2. emacs自动折行设置

    - emacs自动折行     - 临时设置下 M-x `toggle-truncate-lines`    - init.el 中添加 `(toggle-truncate-lines 1)`

  3. CSS3设置内容超过一定长度后自动折行

    在用编辑器保存的数据到数据库的时候经常是在我们的内容前后加一个P标签,但是出来之后是一行,有时候会超过边框的宽度,所以研究了如何折行,如下代码: <!DOCTYPE html> <h ...

  4. Bootstrap table 元素列内容超长自动折行显示方法?

    共需要四步: 1.在table元素的父容器div加上:class="table-responsive" 3.设置表头th的width:<th width="20%& ...

  5. table中td 内容超长 自动折行 (含字母数字文字)

    <table style="width:100%;table-layout:fixed;"> //列宽由表格宽度和列宽度设定 <thead> <th& ...

  6. div 纯数字很长时无法折行解决

    <div style="width:100%;word-wrap:break-word;word-spacing:normal;"> </div> 加上红色 ...

  7. UILabel折行问题 从文件输入文本

    当内存的字符串对象中有\n时,该字符串会在UILabel展示时进行折行. 如果字符串是从plist中拿到的 1,字符串在plist中输入时打入过回车(即字符串在plist中展示也是折行的),那么字符串 ...

  8. [原] Android自动打包之命令行打包

    Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 ...

  9. [修正] Firemonkey 中英文混排折行问题(移动平台)

    问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题. 适用: ...

随机推荐

  1. 关于sql语句实现将'1,2,3'转1,2,3等竖横转换问题

    这是本人的第一个博客,以后会及时整理遇到的问题,方便和大家进行交流. 第一次也不知道说什么了,直接进入正题吧. 因为我的数据在设计时候数据源是竖列存的,满足条件的数据是横列存的.如下图所示: 我要筛选 ...

  2. 自己关于Django的一些实践

    一 render() redirect() HttpResponse() 响应 是个什么东西 def login(request): if request.method=='POST': userna ...

  3. form标签

    一 什么是form标签 <form> 标签用于为用户输入创建 HTML 表单. 表单用于向服务器传输数据. 二 属性 1 method method 属性规定如何发送表单数据(表单数据发送 ...

  4. d3 画简单的柱形图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 【BZOJ1101】Zap(莫比乌斯反演)

    题意:多组询问,对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. T,a,b,d,x,y<=50000 思路:下底函数分块+积性函数 ...

  6. C#实现键盘钩子

    前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...

  7. Windows下载 Curl 命令

    Windows下载 Curl 命令 描述: 不仅Linux命令行可以使用curl命令下载软件, Windows系统的cmd命令窗口也可以使用curl命令下载,并且更稳定. 原文作者:Wayne Zhu ...

  8. UVA - 10050 Hartals

    #include <cstdio> #include <cstring> ]; ]; int main() { int t; scanf("%d", &am ...

  9. 洛谷—— P1503 鬼子进村

    https://www.luogu.org/problemnew/show/P1503 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的 ...

  10. SQL SERVER 工具

    http://www.cnblogs.com/fygh/archive/2012/04/25/2469563.html