1.布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/edit_keys"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:id="@+id/btn_search"
android:layout_width="80dp"
android:layout_height="50dp"
android:text="搜索"/>
</LinearLayout>
<com.example.week01.FlowLayout
android:id="@+id/flow"
flow:textSize="30sp"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="iphone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_view"/>
</com.example.week01.FlowLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="delete"
tools:ignore="OnClick"
android:text="清除历史记录"/>
2.MainActivity
package com.example.week01;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.week01.database.FlowDatabase;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText edit_keys;
private Button btn_search;
private FlowLayout flow;
private FlowDatabase flowDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_keys = findViewById(R.id.edit_keys);
btn_search = findViewById(R.id.btn_search);
flow = findViewById(R.id.flow);
//新建或者初始化数据库
flowDatabase = new FlowDatabase(this);
btn_search.setOnClickListener(this);
//查询搜索历史
List<String> data=flowDatabase.query();
for (int i = 0; i < data.size(); i++) {
//流式布局添加历史
flow.addTextView(data.get(i));
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_search:
String keys = edit_keys.getText().toString();
flow.addTextView(keys);
flowDatabase.insert(keys);
break;
}
// inflate.findViewById(R.id.ftext);
}
public void delete(View v){
//移除所有view
flow.removeAllViews();
//数据库清空所有数据
flowDatabase.delete();
}
}
3.FlowLayout
package com.example.week01;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
public class FlowLayout extends FrameLayout {
private final static int H_DISTANCE = 20;//水平间距是20
private final static int V_DISTANCE = 20;//竖直间距是20
private float mTextSize;
public FlowLayout(Context context) {
super(context);
}
public FlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//自定义
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.flow);
mTextSize = array.getDimension(R.styleable.flow_textSize, 0);
}
public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.flow);
mTextSize = array.getDimension(R.styleable.flow_textSize, 0);
}
public void addTextView(String keys) {
//加载布局页面
TextView textView = (TextView) View.inflate(getContext(), R.layout.flow_item, null);
textView.setText(keys);
//设置字体大小 自定义属性
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
//布局宽高自适应
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
//设置控件布局参数
textView.setLayoutParams(params);
this.addView(textView);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
int width = getWidth();//获取本控件的宽度,用于计算换行
int row = 0;//行数
int disWidth = H_DISTANCE;//子控件左边的坐标
for (int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);//查找子控件
int viewWidth = view.getWidth();
int viewHeight = view.getHeight();
Log.i("dt", "textHeight" + viewHeight);
if (disWidth + viewWidth > width) {//接下来的控件的右边坐标超过了屏幕宽度
row++;//行数增加
disWidth = H_DISTANCE;//还原左边坐标
}
//第一个参数是左边坐标,第二个参数是上边坐标
//左坐标应该是每行子控件宽度的总和disWidth
//右坐标为左坐标+子控件宽度
//上坐标应该是行数*控件高度
//下坐标是上坐标+控件高度=(行数+1)*控件高度
int viewTop = row * viewHeight + row * V_DISTANCE;
view.layout(disWidth, viewTop, disWidth + viewWidth, viewTop + viewHeight);//子控件布局
disWidth += (viewWidth + H_DISTANCE);//记录下一次子控件左边的坐标
}
}
}
4.FlowDatabase数据库创建表
package com.example.week01.database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
public class FlowDatabase extends SQLiteOpenHelper {
private final SQLiteDatabase database;
String table=“flowtable”;
public FlowDatabase(Context context) {
super(context, "flow.db", null, 1);
database = getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table flowtable(id integer primary key autoincrement,keys text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public List<String> query(){
Cursor cursor = database.query(table, null, null, null, null, null, null);
List<String> list=new ArrayList<>();
while (cursor.moveToNext()){
String keys = cursor.getString(cursor.getColumnIndex("keys"));
list.add(keys);
}
return list;
}
/*
删除数据
*/
public void delete(){
database.delete(table,null,null);
}
/*
添加
*/
public void insert(String keys){
ContentValues values=new ContentValues();
values.put("keys",keys);//第一个参数是数据表的字段名
database.insert(table,null,values);
}
}
5.shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dp"
android:color="@color/colorAccent"></stroke>
</shape>
6.attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="flow">
<attr name="textSize" format="dimension"/>
</declare-styleable>