效果图:
XML:
MainActivity:
<?xml version="1.0" encoding="utf-8"?>
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="add"
/>
<com.example.flowlayout.FlowActivity
android:id="@+id/flow"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
FlowActivity中的横向子布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android” android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:id="@+id/item_h"
android:orientation=“horizontal”
>
子布局中的文字布局XML:
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/item_h_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:background="#0cf0cf"
android:gravity="center"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
/>
Activity:
MainActivity:
package com.example.flowlayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.util.ArrayList;
import java.util.List;
/**
-
@author lenovo
/
public class MainActivity extends AppCompatActivity {
/*
定义布局中变量
/
FlowActivity flowActivity;
EditText edit;
Button button;
/*
* 存放输入的字符
/
List listEdit=new ArrayList <>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 获取资源ID
/
flowActivity=findViewById(R.id.flow);
edit=findViewById(R.id.edit);
button=findViewById(R.id.button);
/*
* 按钮的点击事件—>点击按钮,将输入的不同值进行流式布局分布
*/
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//得到输入的值—》放入到集合中
String shu_edit = edit.getText().toString();
listEdit.add(shu_edit);
//进行流式布局
flowActivity.getEdit(listEdit);} });
}
}
FlowActivity(主要):
package com.example.flowlayout;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
-
@author lenovo
-
流式布局
*/
public class FlowActivity extends LinearLayout {Context mcontext;
public FlowActivity(Context context) {
super(context);
mcontext=context;
init();
}public FlowActivity(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mcontext=context;
init();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//宽的计量单位
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//得到屏幕信息
DisplayMetrics displayMetrics = mcon.getResources().getDisplayMetrics();
//屏幕信息的宽像素
int widthPixels = displayMetrics.widthPixels;
setMeasuredDimension(widthPixels,heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
private void init() {
//设置外部LinearLayout为垂直布局
setOrientation(VERTICAL);
}
/**得到输入的字符
* 保存到定义的空的集合中
* @param listEdit
*/
List<String> editList=new ArrayList <>();
public void getEdit(List<String> listEdit){
this.editList=listEdit;
showData();
}
/**
* 对输入的字符进行流式布局处理
*/
public void showData(){
//移除之前的布局--->否则换行时会之前所有的布局重复加上
removeAllViews();
//先向根布局添加一条横向布局
LinearLayout linearLayout_h = (LinearLayout) View.inflate(mcontext, R.layout.item_h, null);
addView(linearLayout_h);
//inflate设置,在xml中设置的宽高没有用,需要
//1.获取布局的参数---getLayoutParams();
//2.对参数进行设置宽高属性
//3.将设置后的应用到布局----setLayoutParams()
// LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) linearLayout_h.getLayoutParams();
// layoutParams.height = 50;
// //layoutParams.weight=1;
// linearLayout_h.setLayoutParams(layoutParams);
/*
* 设置各种子布局
定义临时变量len、设置每行最大字符
*
*/
int maxEdit=20;
int len=0;
//循环字符集合
for (int i = 0; i <editList.size() ; i++) {
String edit = editList.get(i);
len+=edit.length();
//如果len大于maxEdit,换行
if (len>maxEdit){
//在布局里再设置一个子布局
linearLayout_h = (LinearLayout) View.inflate(mcontext, R.layout.item_h, null);
addView(linearLayout_h);
//换行的第一个字符是上一行的最后一个字符
len=edit.length();
}
/**
* 1.定义TextView,添加字符,
* 2.将TextView添加到子布局
*/
View view = View.inflate(mcontext, R.layout.item_h_text, null);
TextView viewText = view.findViewById(R.id.item_h_text);
viewText.setText(editList.get(i));
//子布局添加TextView
linearLayout_h.addView(view);
//设置权重
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.weight=1;
view.setLayoutParams(params);
final int index=i;
/**
* 对输入的字符进行操作事件!!!!!
*/
//字符的点击事件
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mcontext,"点击了"+editList.get(index),Toast.LENGTH_LONG).show();
}
});
//字符的长安事件
view.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//删除
editList.remove(index);
//刷新---重新加载
showData();
return false;
}
});
}
}
}