当前位置: 首页 > news >正文

Android 在TextView前面添加多个任意View且不影响换行

实现效果如下:


如上,将头像后面的东西看作一个整体,因为不能影响后面内容的换行,且前面控件的长度是可变的,所以采用自定义View的方法来实现:

/***  CSDN深海呐 https://blog.csdn.net/qq_40945489/article/details/109399596*/
public class TagTextView extends AppCompatTextView {private Context mContext;private TextView mTabText;private StringBuffer mContentStringBuffer;//必须重写所有的构造器,否则可能会出现无法inflate布局的错误!public TagTextView(Context context) {super(context);mContext = context;}public TagTextView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;}public TagTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext = context;}public void setContentAndTag(String content, List<String> dataList, List<Integer> typeList) {mContentStringBuffer = new StringBuffer();for (String item : dataList) {//将内容添加到content,用drawable替代这些内容所占的位置mContentStringBuffer.append(item);}mContentStringBuffer.append(content);SpannableString spannableString = new SpannableString(mContentStringBuffer);for (int i = 0; i < dataList.size(); i++) {String item = dataList.get(i);View view = LayoutInflater.from(mContext).inflate(R.layout.layout_texttab, null);//R.layout.tag是每个标签的布局switch (typeList.get(i)){case 1:view = LayoutInflater.from(mContext).inflate(R.layout.layout_texttab1, null);break;case 2:view = LayoutInflater.from(mContext).inflate(R.layout.layout_texttab2, null);break;}mTabText = view.findViewById(R.id.tabText);mTabText.setText(item);Bitmap bitmap = convertViewToBitmap(view);Drawable d = new BitmapDrawable(bitmap);d.setBounds(0, 0, mTabText.getWidth(), mTabText.getHeight());ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);//图片对齐底部int startIndex;int endIndex;startIndex = getLastLength(dataList, i );endIndex = startIndex + item.length();spannableString.setSpan(span, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}setText(spannableString);setGravity(Gravity.CENTER_VERTICAL);}private static Bitmap convertViewToBitmap(View view) {view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());view.buildDrawingCache();Bitmap bitmap = view.getDrawingCache();return bitmap;}private int getLastLength(List<String> list, int maxLength) {int length = 0;for (int i = 0; i < maxLength; i++) {length += list.get(i).length();}return length;}
}

使用举例:  (😂抱歉啊使用这边没有用Java写,不会Kotlin的应该也能看懂啥意思)

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initView();}private fun initView() {setText("很长很长的一段话一段话一段话  真的很长很长很长......")}private fun setText(string: String) {val title : TagTextView = findViewById(R.id.main_text)val dataList = arrayListOf<String>()dataList.add("用户的名字")dataList.add("48")dataList.add("  长老")val dataListType = arrayListOf<Int>()dataListType.add(0);dataListType.add(1);dataListType.add(2);title.setContentAndTag(""+string+"", dataList,dataListType)}
}

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/head" /><com.example.demo.TagTextViewandroid:id="@+id/main_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="当前是用户发的一段话很长很长的一段话,非常长非常长!!!!!!"android:textColor="@color/TextColor"android:textSize="12sp" /></LinearLayout></LinearLayout>

la:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/tabText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawablePadding="6dp"android:drawableRight="@mipmap/sex"android:gravity="center"android:paddingRight="8dp"android:text="CSDN深海呐"android:textColor="@color/HeadText"android:textSize="12sp" /></LinearLayout>

dataListType的 0,1,2 分别对应三种不同的布局赋值,XML文件我就不全部发出来了,这里可以自主发挥。

http://www.lryc.cn/news/161468.html

相关文章:

  • 字符串相加
  • uni-app直播从0到1实战
  • Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析
  • LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)
  • java基础面试题 第四天
  • postgresql-常用日期函数
  • 【业务场景】用户连点
  • zabbix企业微信告警
  • (高频面试1)Redis缓存穿透、缓存击穿、缓存雪崩
  • c++推箱子小游戏
  • SpringMVC:从入门到精通
  • jmeter 数据库连接配置 JDBC Connection Configuration
  • TVC广告片制作成本多少
  • 【Express.js】代码规范
  • Vue2+Vue3基础入门到实战项目(前接六 副线一)—— 面经 项目
  • QT tcpserver
  • Android adb shell svc 知识详解
  • Debian12系统下LAMP环境中Nubuilder4.5的安装
  • 百度超级链BaaS服务平台调研
  • 计算机网络之TCP/IP协议第二篇:OSI参考模型详解
  • Linux内核分析与应用2-内存寻址
  • 苍穹外卖 day12 Echats 营业台数据可视化整合
  • 代码随想录算法训练营day45|70. 爬楼梯(进阶版)|322. 零钱兑换|279.完全平方数
  • 数据结构和算法(3):列表
  • 使用playright自动下载vscode已安装插件
  • 单片机语言实例:2、点亮数码管的多种方法
  • C#学习 - 初识类与名称空间
  • Python爬取电影信息:Ajax介绍、爬取案例实战 + MongoDB存储
  • JavaScript的面向对象
  • MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具