欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android自定View流式布局根据文字数量换行

程序员文章站 2022-05-16 12:22:03
本文实例为大家分享了android根据文字数量换行的具体代码,供大家参考,具体内容如下 //主页 定义数据框 package com.example.c...

本文实例为大家分享了android根据文字数量换行的具体代码,供大家参考,具体内容如下

//主页 定义数据框

package com.example.customwaterfallviewgroup;

import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.view;
import android.widget.edittext;

import java.util.arraylist;
import java.util.list;

public class mainactivity extends appcompatactivity {
  list<string> stringlist = new arraylist<>();
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    initview();
  }

  private void initview() {
    final edittext edittext = findviewbyid(r.id.edit);
    final customwaterfallviewgroup customwaterfallviewgroup = findviewbyid(r.id.water_fill);
    findviewbyid(r.id.button).setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
        //获取输入框的值
        string str = edittext.gettext().tostring();
        //将文字放入列表
        stringlist.add(str);
        //设置数据
        customwaterfallviewgroup.setdata(stringlist);
      }
    });
  }
}

//zhuye 布局

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  tools:context=".mainactivity">

  <edittext
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/edit"
    android:hint="输入"
    />
  <button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:text="add"
    />
  <com.example.customwaterfallviewgroup.customwaterfallviewgroup
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/water_fill"
    />
</linearlayout>

//自定义流式布局

package com.example.customwaterfallviewgroup;

import android.content.context;
import android.graphics.canvas;
import android.util.attributeset;
import android.util.displaymetrics;
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;

public class customwaterfallviewgroup extends linearlayout {
  //设置每一行最大的字符串的长度
  int mmaxsize = 22;
  //传入的字符串数组
  list<string> stringlist = new arraylist<>();
  context mcontext;

  public customwaterfallviewgroup(context context) {
    super(context);
    mcontext = context;
    init();
  }

  public customwaterfallviewgroup(context context,attributeset attrs) {
    super(context, attrs);
    mcontext = context;
    init();
  }
  //定义布局
  private void init() {
    //设置最外层的linearlayout 为垂直布局
    setorientation(vertical);
  }

  @override
  protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
    super.onmeasure(widthmeasurespec, heightmeasurespec);
    displaymetrics displaymetrics = mcontext.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);
  }

  public void setdata(list<string> stringlist) {
    //上一个输入框里的数据存到这个页面的集合中 
    this.stringlist = stringlist;
    showdata();
  }

  private void showdata() {
    //因为每一次都要重新画 ,所以移除之前的布局 显示更新过的布局
    removeallviews();
    //优先向跟布局添加一条横向布局
    linearlayout linearlayout_h = (linearlayout) view.inflate(mcontext,r.layout.item_water_fall_h,null);
    addview(linearlayout_h);
    //定义临时变量。用来计算最后一行已有的字符长度
    int len = 0;
    for (int i = 0;i<stringlist.size();i++){
      string str = stringlist.get(i);
      //将次字符串长度与记录的已有字符串长度相加
      len += str.length();
      //-判断 如果大于最大长度,说明这一行放不下了
      //需要自动换行
      if (len > mmaxsize){
        //像跟布局添加一条横布局
        linearlayout_h = (linearlayout) view.inflate(mcontext,r.layout.item_water_fall_h,null);
        addview(linearlayout_h);
        //换行以后因为不添加了 所以 当前的救是最后一行的长度
        len = str.length();
      }
      //添加一个textview控件
      view view = view.inflate(mcontext,r.layout.water_fall_textview,null);
      //获取到它的id
      textview textview = view.findviewbyid(r.id.water_fall_textview);
      //得到后给它赋值 (输入框里的值 给它)
      textview.settext(str);
      //添加到布局中
      linearlayout_h.addview(view);

      //设置权重 让每一行内所有的控件相加充满整行,并合理分配
      linearlayout.layoutparams layoutparams = (linearlayout.layoutparams) view.getlayoutparams();
      layoutparams.weight = 1;
      view.setlayoutparams(layoutparams);

      final int index = i;
      view.setonclicklistener(new onclicklistener() {
        @override
        public void onclick(view v) {
          toast.maketext(mcontext,"您点击了"+stringlist.get(index),toast.length_short).show();
        }
      });
      view.setonlongclicklistener(new onlongclicklistener() {
        @override
        public boolean onlongclick(view v) {
          stringlist.remove(index);
          showdata();
          return false;
        }
      });
    }
  }
}

//每一行的布局

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/water_fall_h"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal">

</linearlayout>

//流式布局

<?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="wrap_content"
  android:orientation="horizontal"
  >

  <textview
    android:id="@+id/water_fall_textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/coloraccent"
    android:layout_weight="1"
    android:textsize="20dp"
    android:layout_marginright="5dp"
    android:layout_marginleft="5dp"
    android:layout_margintop="10dp"
    android:gravity="center"
    />
</linearlayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。