Android应用开发—TextView的动态创建

动态创建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冲突呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongo DB 简单搭建和部署

1.先下载源代码包 官网下载地址&#xff1a;http://www.mongodb.org/downloads 2.解包tar xf mongodb-linux-x86_64-rhel62-3.2.7.tgz 3.把包移动到 /usr/local/mongodb mv mongodb-linux-x86_64-rhel62-3.2.7/ /usr/local/mongodb 指定同一时间最多可开启的文件数&#xff08…

运算符优先级 必熟记,放到心里

优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 &#xff08;表达式&#xff09;/函数名(形参表) . 成员选择&#xff08;对象&#xff09; 对象.成员名 -> 成员选择&#xff08;指针&#xff0…

可持久化平衡树(FHQ Treap)

两个最基本的操作 merge合并 split分割 merge 把两棵treap合并成一棵treap&#xff0c;要满足T1最大值要比T2最小值小&#xff0c;比较将随机数值key值更大的作为合并后的根 假设T1作为根节点作为新子树的根&#xff0c;左子树不变&#xff0c;右子树对T1原来的右子树与T2再递归…

Git 分支管理-git stash 和git stash pop

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 合并分支&#xff0c;冲突是难免的&#xff0c;在实际协作开发中我们遇到的情况错综复杂&#xff0c;今天就讲两个比较重要的命令使用gi…

useState语法讲解

useState语法讲解 语法定义 const [state, dispatch] useState(initData)state&#xff1a;定义的数据源&#xff0c;可视作一个函数组件内部的变量&#xff0c;但只在首次渲染被创造。dispatch&#xff1a;改变state的函数&#xff0c;推动函数渲染的渲染函数。dispatch有两…

NSOperation的进阶使用和简单探讨

本文将会从多个方面探讨NSOperation类和NSOperationQueue类的相关内容 一、简介 NSOperation类是iOS2.0推出的&#xff0c;通过NSThread实现的,但是效率一般。 从OS X10.6和iOS4推出GCD时&#xff0c;又重写了NSOperation和NSOperationQueue&#xff0c;NSOperation和NSOperati…

Android应用开发—LayoutParams的用法

Android应用开发—TextView的动态创建 这篇文章讲到了“TextView控件布局位置的控制”&#xff0c;主要依赖于RelativeLayout.LayoutParams的使用&#xff0c;本文简单介绍下LayoutParams的用法 注&#xff1a;本文大部分内容参考android,利用layoutParams代码动态布局空间位置…

廖雪峰Java1-2程序基础-7布尔运算符

布尔运算符 关系运算符&#xff1a;>&#xff0c; >&#xff0c; <&#xff0c; <&#xff0c; &#xff0c;!与运算 &&或运算 |非运算 &#xff01;int n 5;boolean t n > 0;//trueboolean f n < 0;//falseboolean isFive n 5;//trueboolean i…

第二十一届国际C语言混乱代码大赛结果公布

摘要&#xff1a;国际C语言混乱代码大赛&#xff08;IOCCC, The International Obfuscated C Code Contest&#xff09;是一项著名的国际编程赛事&#xff0c;从1984年开始到2006年&#xff0c;每年举办一次。2006年后中止了多年&#xff0c;2011年又开始恢复。比赛的目的是写出…

QuartZ Cron表达式

CronTrigger 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日历的概念&#xff0c;而非SimpleTrigger完全指定的时间…

maven02-----Maven项目构建的初次使用

一. 创建Maven项目 1.1 建立一个Hello项目 当然也可以通过java project的方式创建符合Maven约定的目录结果的项目&#xff0c;并手动建立pom.xml文件&#xff0c;但是太繁琐了。因此&#xff0c;这里直接建立maven项目。note: eclipse有内建的maven项目创建功能&#xff0c;倘若…

微软超过苹果 成为全球第一大市值公司

11月23日周五盘中至收盘&#xff0c;微软市值正式超过苹果&#xff0c;成为世界上市值最高的公司。收盘时&#xff0c;微软市值为7533.4亿美元&#xff0c;苹果市值为7468.2亿美元&#xff0c;亚马逊市值为7366.2亿美元&#xff0c;谷歌市值为7255.2亿美元。 上次苹果与微软市值…

创新大赛成就创业梦想 超30%入榜应用获投资意向

摘要&#xff1a;腾讯开放平台宣布移动应用赛区正式开启&#xff0c;新一轮的创业梦想正在成长中。据悉&#xff0c;在腾讯开放平台应用创新大赛中诞生了多款DAU&#xff08;日活跃用户数&#xff09;超百万的应用。小鱼吃吃吃、开心泡泡猫等引领社交游戏潮流&#xff0c;视频达…

如何判断软件架构的好与坏

判断一个软件的架构的好与坏有很多方法&#xff0c;不过如果让我一句话来描述的话&#xff1a; 如果一个软件开发程度在70%以上的情况下&#xff0c;加入一个新功能&#xff0c;还需要涉及到大量的文件&#xff0c;代码的修改&#xff0c;那么这个软件架构一定很烂&#xff0c;…

网关(Gateway)详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高…

【重点突破】—— React实现富文本编辑器

前言&#xff1a;富文本编辑器Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器&#xff0c;所见即所得的文本编辑器。 一、安装插件 react-draft-wysiwyg&#xff1a; 文本编辑器插件 draftjs-to-html&#xff1a;文本转换为html的插件 yarn add react-draft-wysiwyg draftj…

1106: 回文数(函数专题)

题目描述 一个正整数&#xff0c;如果从左向 右读&#xff08;称之为正序数&#xff09;和从右向左读&#xff08;称之为倒序数&#xff09;是一样的&#xff0c;这样的数就叫回文数。输入两个整数m和n&#xff08;m<n)&#xff0c;输出区间[m&#xff0c;n]之间的回文数。 …

Ubuntu 12.10 正式发布

Canonical今天正式发布了Ubuntu 12.10版本&#xff0c;代号为“Quantal Quetzal”&#xff0c;意为量子绿咬鹃&#xff0c;绿咬鹃是一种生活在美洲的颜色极为鲜艳的鸟。Ubuntu的版本代号一直都这么奇怪。 在该版本中&#xff0c;改进了Unity桌面环境&#xff0c;弱化了本地应用…