版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77131800

动态创建TextView的两种方式:

下面介绍两种创建方式:

在drawable里面创建共同依赖的background.xml文件,里面设置shape来设置文本框的一些特殊效果:
eg:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" ><!-- 实心 -->  <solid android:color="@android:color/white" />  <!-- 边框 -->  <stroke  android:width="0.5dp"  android:color="@android:color/black" />  <!-- 圆角 -->  <corners android:radius="3dp" />  <!-- 边距 -->  <padding  android:bottom="10dp"  android:left="10dp"  android:right="10dp"  android:top="10dp" />  <!-- 渐变 -->  <gradient  android:angle="270"  android:endColor="#FFFF782"  android:startColor="#13C7AF" />
</shape> 
  • 代码方式:
TextView textView = new TextView(context);
textView.setId(id);
textView.setText("android");
textView.setTextColor(0xff999faa);
textView.setTextSize(12);
textView.setBackgroundResource(R.drawable.background);
  • xml配置文件和代码结合方式:
textview_layout.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextView
        android:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#999faa"android:textSize="12sp"android:background="@drawable/background"android:text="android" />
</LinearLayout>
ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.textiew, null);
TextView textView = (TextView) findViewById(R.id.textView);
viewGroup.removeView(textView);//替换掉textId
textView.setId(id);

这样通过前面的两种方式即可创建一个TextView控件,通过xxxViewGroup.addView(textView)即可将改textView加入到xxxViewGroup中。

TextView控件布局位置的控制:

上面创建了textView控件,但该控件的布局位置并没有确定,而这个布局位置又是十分重要的,否则该控件也没有存在的意义。

//此处以RelativeLayout布局为例,同样LinearLayout也支持该接口
//设置RelativeLayout布局的宽高
RelativeLayout.LayoutParams reLayoutParams =
new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
//以下rules说明设置控件在xxxView的右侧,父控件的底部
reLayoutParams.addRule(RelativeLayout.RIGHT_OF, xxxViewId);
reLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
//setMargins设置控件相对其他控件的间隔
reLayoutParams.setMargins(left, top, right, bottom);

以上代码只完成了RelativeLayout的布局rules的设置,如何和待控制的控件绑定呢?

xxxViewGroup.addView(textView,reLayoutParams);

为TextView添加边框

在文章开始部分创建了一个background.xml文件,但并没有说明该xml文件的作用,不过也容易猜到,这个background.xml为textView设置了一个边框。
默认情况下TextView控件是没有边框的,如何创建边框,有以下方式:

  • 设置background为透明图片的背景图。
  • 通过shape设置背景图片。(推荐,background.xml即为这个shape配置文件,对该文件各项参数的设置,请参考google)

对前面代码中几处关键点的说明:

  • View.setId(int id)如何避免id冲突:
    按照规则,每个View都必须有一个唯一的标识符,这个标识符是一个正整数。而我们上面代码中动态创建的View要如何保证id的唯一性?
    在sdk17 以上使用myView.setId(View.generateViewId());在低于17 的版本中我们需要自己去实现一些方法,参考View.Java的内部实现:
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);/**
* Generate a value suitable for use in {@link #setId(int)}.
* This value will not collide with ID values generated at build time by aapt for R.id.
*
* @return a generated ID value
*/
public static int generateViewId() {for (;;) {final int result = sNextGeneratedId.get();// aapt-generated IDs have the high byte nonzero; clamp to the range under that.int newValue = result + 1;if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.if (sNextGeneratedId.compareAndSet(result, newValue)) {return result;}}
}ID大于0x00FFFFFF的已经在xml中定义到了,容易发生冲突。在调用的地方可以这样使用:if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {myView.setId(Utils.generateViewId());} else {myView.setId(View.generateViewId());}}
  • 为什么要调用viewGroup.removeView(textView)?
    一个View只能依赖于一个父ViewGroup,我们通过inflate这种方式创建的view已经属于一个ViewGroup了,所以此处需要父ViewGroup先remove掉,否则会报这样的错误:”The specified child already has a parent. You must call removeView”
    关于异常“The specified child already has a parent. You must call removeView”的解决

扩展内容—动态添加布局

前面讲到动态添加控件,而布局同样可以动态添加:

方法和上面类似,主要注重如何控制添加的布局的位置,在控制布局的位置的时候使用LayoutParam类来实现。

RelativeLayout rl = new RelativeLayout(this);
//设置RelativeLayout布局的宽高
RelativeLayout.LayoutParams relLayoutParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
xxxViewGroup.addView(rl, relLayoutParams); 

控件属性相关的一些动态设置的接口:

// 设置背景图
textView.setBackgroundResource(R.drawable.block_text_backgroumg);
// 设置背景透明度
textView.getBackground().setAlpha(150);
// 设定text内容为Html格式
textView.setText(Html.fromHtml(rsultText));
// 设定为可以scroll的textView
textView.setMovementMethod(ScrollingMovementMethod.getInstance());
// 设定text内容与边框的距离
textView.setPadding(6, 6, 6, 6);  

参考资料:

Android 利用addView 动态给Activity添加View组件
android 中使用View.setId(int id),如何避免id冲突呢?

Android应用开发—TextView的动态创建相关推荐

  1. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  2. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...

  3. android wear 浮动通知,Android Wear 开发 (一) 创建手表通知

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? I bought a moto 360 last year. But I seldom wear it, because ...

  4. Android Studio开发基础之动态注册与注销BroadcastReceiver

    1.New→Other→BroadcastReceiver package com.example.lhb.startservice;import android.content.BroadcastR ...

  5. android studio登录注销,Android Studio开发基础之动态注册与注销BroadcastReceiver

    1.New→Other→BroadcastReceiver package com.example.lhb.startservice; import android.content.Broadcast ...

  6. Android应用开发—LayoutParams的用法

    Android应用开发-TextView的动态创建 这篇文章讲到了"TextView控件布局位置的控制",主要依赖于RelativeLayout.LayoutParams的使用,本 ...

  7. android module中获取 app_Android组件化架构 - 4. 动态创建

    Android 组件化中使用动态创建的作用是解耦: 1. 反射机制 反射有两个作用:1.反编译:.class->.java;2.通过反射机制访问java对象中的属性,方法,构造器等: 实现反射, ...

  8. Android应用开发:数据存储和界面展现-2

    1. pull解析XML文件 Android推荐使用pull解析XML文件,与SAX解析XML文件类似,都是事件驱动类型的解析方式. 示例:获取天气信息 res\layout\activity_mai ...

  9. 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

    文章目录 I . Native 调用 Java 方法 II . JNIEnv *env 与 jobject instance III . JavaVM *vm IV . 局部引用 与 全局引用 分析 ...

最新文章

  1. 需要反射时使用dynamic
  2. Android客户端与服务器之间的通信
  3. Can you raed it croretcly?
  4. P2490-[SDOI2011]黑白棋【博弈论,dp】
  5. sqoop2 mysql导入hdfs_Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)
  6. 2021年中国电动气动控制器市场趋势报告、技术动态创新及2027年市场预测
  7. 未来5年中国企业信息化格局
  8. 正则匹配身份证和邮箱
  9. 【leetcode】给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff数对。
  10. 【微信小程序】身份证拍照、上传并OCR识别
  11. SadpTool 海康设备网络搜索工具
  12. xml与json格式互转
  13. kali安装flash插件
  14. 用户管理“明星”工具——在线客服系统
  15. solr全文搜索的使用
  16. CCF推荐的中文期刊
  17. [论文笔记]Spectrum Sharing in Vehicular Networks Based on Multi-Agent Reinforcement Learning
  18. PS如何快速还原与恢复图片?
  19. 微信小程序上传组件(可同时长传图片+视频)
  20. 一张微信智能名片能否挽救企业被浪费的80%商机?

热门文章

  1. 中医治疗慢性病很有效
  2. CentOS 7.0关闭默认防火墙启用iptables防火墙
  3. SpringMvc通过@Value( ) 给静态变量注入值
  4. C#操作WMI文章汇总
  5. ImageMagick之PDF转换成图片(image)
  6. JS模块化工具requirejs教程02
  7. Apache与Tomcat联系及区别(转)
  8. 减少企业Web威胁的三条预防性措施
  9. 盘外招无法击垮比特币现金(BCH)的意志
  10. Apache用户认证、域名跳转、Apache访问日志