自动换行&&自动补全TextView

来源:互联网 发布:高考逆袭 知乎 编辑:程序博客网 时间:2024/06/11 19:43

效果图:


工具类MultipleTextViewGroup:

package util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.autotextview.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MultipleTextViewGroup extends RelativeLayout {
private Context context;
private float textSize;
private int textColor;
private int wordMargin;
private int lineMargin;
private int textPaddingLeft;
private int textPaddingRight;
private int textPaddingTop;
private int textPaddingBottom;
private boolean overspread;
private int columnNum;
private int textBackground;
private int layout_width;
private OnMultipleTVItemClickListener listener;
public MultipleTextViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.MultipleTextViewGroup);
textColor = array.getColor(R.styleable.MultipleTextViewGroup_textColor,
0XFF00FF00); // 提供默认值,放置未指定
textSize = array.getDimension(
R.styleable.MultipleTextViewGroup_textSize, 24);
textSize = px2sp(context, textSize);
wordMargin = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textWordMargin, 0);
lineMargin = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textLineMargin, 0);
textBackground = array.getResourceId(
R.styleable.MultipleTextViewGroup_textBackground, -1);
textPaddingLeft = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingLeft, 0);
textPaddingRight = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingRight, 0);
textPaddingTop = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingTop, 0);
textPaddingBottom = array.getDimensionPixelSize(
R.styleable.MultipleTextViewGroup_textPaddingBottom, 0);
overspread = array.getBoolean(
R.styleable.MultipleTextViewGroup_overspread, false);
columnNum = array.getInteger(
R.styleable.MultipleTextViewGroup_columnNum, 1000);
array.recycle();
// 下边是获取系统属性
int[] attrsArray = new int[] { android.R.attr.id, // 0
android.R.attr.background, // 1
android.R.attr.layout_width, // 2
android.R.attr.layout_height, // 3
android.R.attr.layout_marginLeft, // 4
android.R.attr.layout_marginRight // 5
};
TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);
try {
layout_width = ta.getDimensionPixelSize(2,
ViewGroup.LayoutParams.MATCH_PARENT);
} catch (Exception e) {
DisplayMetrics dm = getResources().getDisplayMetrics();
layout_width = dm.widthPixels;
}
int marginRight = ta.getDimensionPixelSize(4, 0);
int marginLeft = ta.getDimensionPixelSize(5, 0);
layout_width = layout_width - marginRight - marginLeft;
ta.recycle();
}
public OnMultipleTVItemClickListener getOnMultipleTVItemClickListener() {
return listener;
}
public void setOnMultipleTVItemClickListener(
OnMultipleTVItemClickListener listener) {
this.listener = listener;
}
@SuppressLint("UseSparseArrays")
public void setTextViews(List<String> dataList) {
if (dataList == null || dataList.size() == 0) {
return;
}
int line = 0;
Map<Integer, List<TextView>> lineMap = new HashMap<Integer, List<TextView>>();
List<TextView> lineList = new ArrayList<TextView>();
lineMap.put(0, lineList);
int x = 0;
int y = 0;
for (int i = 0; i < dataList.size(); i++) {
TextView tv = new TextView(context);
tv.setText(dataList.get(i));
tv.setTextSize(textSize);
if (textBackground != -1)
tv.setBackgroundResource(textBackground);
tv.setTextColor(textColor);
tv.setPadding(textPaddingLeft, textPaddingTop, textPaddingRight,
textPaddingBottom);
tv.setTag(i);// 标记position
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onMultipleTVItemClick(v, (Integer) v.getTag());
}
}
});
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
tv.measure(w, h);
int tvh = tv.getMeasuredHeight();
int tvw = getMeasuredWidth(tv);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if (x + tvw > layout_width || lineMap.get(line).size() >= columnNum) {
x = 0;
y = y + tvh + lineMargin;
line++;
lineMap.put(line, new ArrayList<TextView>());
}
lp.leftMargin = x;
lp.topMargin = y;
x = x + tvw + wordMargin;
tv.setLayoutParams(lp);
lineMap.get(line).add(tv);
}
for (int i = 0; i <= line; i++) {
int padding = 0;
if (overspread) {
// 该行最后一个位置
int len = lineMap.get(i).size();
TextView tView = lineMap.get(i).get(len - 1);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) tView
.getLayoutParams();
int right = lp.leftMargin + getMeasuredWidth(tView);
int emptyWidth = layout_width - right;
padding = emptyWidth / (len * 2);
}
int leftOffset = 0;
for (int j = 0; j < lineMap.get(i).size(); j++) {
TextView tView2 = lineMap.get(i).get(j);
if (overspread) {
RelativeLayout.LayoutParams lp2 = (RelativeLayout.LayoutParams) tView2
.getLayoutParams();
lp2.leftMargin = lp2.leftMargin + leftOffset;
leftOffset = (j + 1) * 2 * padding;
}
tView2.setPadding(tView2.getPaddingLeft() + padding,
tView2.getPaddingTop(), tView2.getPaddingRight()
+ padding, tView2.getPaddingBottom());
addView(tView2);
}
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
}
public int getMeasuredWidth(View v) {
return v.getMeasuredWidth();
}
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
public interface OnMultipleTVItemClickListener {
void onMultipleTVItemClick(View view, int position);
}
}

attrs.xml:

<resources>
    <declare-styleable name="MultipleTextViewGroup">
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
        <attr name="textWordMargin" format="dimension" />
        <attr name="textLineMargin" format="dimension" />
        <attr name="textBackground" format="reference" />
        <attr name="textPaddingLeft" format="dimension" />
        <attr name="textPaddingRight" format="dimension" />
        <attr name="textPaddingTop" format="dimension" />
        <attr name="textPaddingBottom" format="dimension" />
        <attr name="overspread" format="boolean" />
        <attr name="columnNum" format="integer" />
    </declare-styleable>
</resources>

shape.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="2dp" />
    <stroke
        android:width="1px"
        android:color="#ddd" />
    <solid android:color="#eee" />
</shape>

activity_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<util.MultipleTextViewGroup 
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_rl"
        android:layout_width="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_height="wrap_content"
        app:textSize="12sp"
        app:textWordMargin="10dp"
        app:textLineMargin="10dp"
        app:textColor="#ff0000"
        app:textBackground="@drawable/shape_tag_grey_with_border"
        app:textPaddingLeft="10dp"
        app:textPaddingRight="10dp"
        app:textPaddingTop="10dp"
        app:textPaddingBottom="10dp"
        app:columnNum="2"
        app:overspread="true" />

</FrameLayout>

columnNum:设置每行显示的TextView个数(可不设)

overspread:设置每行最后一个TextView是否填充剩余空间

MainActivity:

package com.example.autotextview;
import java.util.ArrayList;
import java.util.List;
import util.MultipleTextViewGroup;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity implements
MultipleTextViewGroup.OnMultipleTVItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> dataList = new ArrayList<String>();
dataList.add("火女");
dataList.add("狼人");
dataList.add("DOTA && 英雄联盟");
dataList.add("疯狂的伐木机");
dataList.add("门前大桥下游过一群鸭");
dataList.add("大家快来数一数");
dataList.add("五四六七八");
dataList.add("咕嘎咕嘎");
dataList.add("真呀真多啊");
dataList.add("数不清到底多少鸭");
dataList.add("呀");
dataList.add("丫");
MultipleTextViewGroup rl = (MultipleTextViewGroup) findViewById(R.id.main_rl);
rl.setOnMultipleTVItemClickListener(this);
rl.setTextViews(dataList);
}
public void onMultipleTVItemClick(View view, int position) {
Toast.makeText(getApplicationContext(), "点了第" + position + "个按钮",
Toast.LENGTH_SHORT).show();
}
}

0 0