简易流式布局

效果图:

在这里插入图片描述

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;
            }
        });

    }


}

}

猜你喜欢

转载自blog.csdn.net/weixin_43258668/article/details/84653183