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

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77131800 动态创建T...
版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
   }

}

扩展内容—动态添加布局

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

方法和上面类似,主要注重如何控制添加的布局的位置,在控制布局的位置的时候使用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冲突呢?

目录
相关文章
|
2天前
|
Android开发
android TextView HTML 的效果
android TextView HTML 的效果
|
5天前
|
移动开发 Java Android开发
Android应用开发:Kotlin语言的优势与实践
【5月更文挑战第7天】 在移动开发的世界中,Android平台的Kotlin语言以其高效、简洁的语法和强大的功能吸引了众多开发者。本文将深入探讨Kotlin语言的核心优势,并通过实际案例展示如何在Android应用开发中有效地运用这一现代编程语言。我们将从语言特性出发,逐步分析其在提升开发效率、改善代码质量以及增强应用性能方面的具体表现,为读者提供一个全面而细致的Kotlin应用开发指南。
|
6天前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
|
1月前
|
XML Java Android开发
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
|
1月前
|
安全 API Android开发
Android应用开发中实现动态权限请求的实践指南
【4月更文挑战第5天】 在现代安卓应用开发中,用户隐私和安全日益受到重视。自Android 6.0(API级别23)起,系统引入了动态权限模型,要求应用在运行时而非安装时请求特定权限。这一变化迫使开发者调整权限请求策略,以增强用户信任并确保应用的正常运行。本文将深入探讨如何在Android应用中有效实施动态权限请求,提供一套详细的实践流程,并通过代码示例阐释关键步骤。我们将讨论如何判断权限的必要性、向用户发起请求的最佳时机以及如何处理用户的授权结果。
|
2月前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
13 0
|
8月前
|
Android开发
Android应用开发权限
Android应用开发权限
44 1
|
9月前
|
XML Android开发 数据格式
Android 中使用SpannableString实现TextView文本超链接跳转功能
Android 中使用SpannableString实现TextView文本超链接跳转功能
164 0
|
9月前
|
Android开发
Android 实现视图文本TextView的展开与收缩功能
Android 实现视图文本TextView的展开与收缩功能
214 0