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.pswp.cn/news/450199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450199.shtml
英文地址,請注明出處:http://en.pswp.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;弱化了本地應用…