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. java追加文本到文件末尾

    public class Test { public static void main(String[] args) { method1("F:\\test.txt" , &quo ...

  2. C#递归删除进程及其子进程

    /// <summary> /// 结束进程和相关的子进程 /// </summary> /// <param name="pid">需要结束的 ...

  3. Date对象在苹果手机下兼容问题的解决方法

    Date在不同浏览器中对于传入的时间字符串的格式要求是不一样的.比如在chrome浏览器的控制台中输入以下内容,会得到相应结果: Date.parse('2015-11-11 00:00:00') / ...

  4. poj 3468 线段树成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 54012   ...

  5. APUE 学习笔记(八) 线程同步

    1. 进程的所有信息对该进程内的所有线程都是共享的 包括 可执行的程序文本.程序全局内存.堆内存以及文件描述符 线程包含了表示进程内执行环境必需的信息,包括线程ID.寄存器值.栈.调度优先级和策略.信 ...

  6. FZOJ Problem 2148 Moon Game

                                                                                                  Proble ...

  7. J2ME开发基本语法及小实例专题

    原文发布时间为:2008-07-31 -- 来源于本人的百度文章 [由搬家工具导入] http://www.wcplym.com/sbjtClassArtl.asp?id=4 ·Canva专题:漂亮的 ...

  8. javap的基本用法

    参考:http://www.cnblogs.com/beautiful-code/p/6424977.html javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们 ...

  9. 27深入理解C指针之---字符串基础

    一.字符串:是以ASCII字符NUL结尾的字符序列,NUL表示为\0 1.定义:将字符按顺序存储在数组中,以NUL结尾. 2.特征: 1).每个字符串长度只是包含所有的字符,不包括最后的NUL,手动分 ...

  10. hdu3572 任务分配/最大流判断满流

    题意:将n个任务分配为m个机器,给每个任务需要的天数(无需每天连续),和可以在哪些天去做该任务,求是否存在方案. 典型的任务(X)----天(Y)二分最大流,(因为这里任务是与天的关系)处理器控制流量 ...