Android中XML的命名空間、自定義屬性xmlns:app="http://schemas.android.com/apk/res-auto"

基本概念介紹

命名空間(namespace)

XML 命名空間提供避免元素命名沖突的方法跨嘉。

打個(gè)比方,A學(xué)校有名學(xué)生叫做林小明,B學(xué)校也有名學(xué)生叫林小明,那我們?nèi)绾巫R(shí)別這兩名擁有相同名字的同學(xué)呢?這時(shí)候命名空間就派上用場(chǎng)了歧譬。A和B此時(shí)就可以被當(dāng)成是命名空間了。也就是說(shuō)泼返,命名空間里面存放的是特定屬性的集合,

Android中常見(jiàn)的命名空間

下面分別介紹android、tools宝恶、app(自定義命名空間)這幾個(gè)常見(jiàn)的命名空間

1符隙、android

xmlns:android=”http://schemas.android.com/apk/res/android?

在Android布局文件中我們都必須在根元素上定義這樣一個(gè)命名空間,接下來(lái)對(duì)這行代碼進(jìn)行逐一講解:?

xmlns:即xml namespace,聲明我們要開(kāi)始定義一個(gè)命名空間了?

android:稱作namespace-prefix垫毙,它是命名空間的名字?

http://schemas.android.com/apk/res/android這看起來(lái)是一個(gè)URL霹疫,但是這個(gè)地址是不可訪問(wèn)的。實(shí)際上這是一個(gè)URI(統(tǒng)一資源標(biāo)識(shí)符),所以它的值是固定不變的,相當(dāng)于一個(gè)常量)综芥。

有了他丽蝎,就會(huì)提示你輸入什么,也可以理解為語(yǔ)法文件膀藐。

使用這行代碼屠阻,我們就可以引用命名空間中的屬性,如:

在這個(gè)布局中,只要以android:開(kāi)頭的屬性便是引用了命名空間中的屬性,

android是賦予命名空間一個(gè)名字,就跟我們平時(shí)在定義變量一樣,比如我把它取成myns,那么上面的代碼我們也可以寫(xiě)成:

2额各、tools

xmlns:tools=”http://schemas.android.com/tools

接下來(lái)會(huì)介紹国觉,關(guān)于tools的三種使用方法吧,也算是他的特性虾啦。

2.1麻诀、tools只作用于開(kāi)發(fā)階段

我們可以把他理解為一個(gè)工具(tools)的命名空間,它的只作用于開(kāi)發(fā)階段,當(dāng)app被打包時(shí),所有關(guān)于tools屬性將都會(huì)被摒棄掉!

例如,基本上在android命名空間內(nèi)的屬性,我們想在編寫(xiě)代碼階段測(cè)試某個(gè)組件在屏幕上的效果,而當(dāng)app安裝到手機(jī)上時(shí)傲醉,摒棄掉這條代碼,那么我們就可以用tools命名空間來(lái)代替掉android:

以上是在layout中的布局,當(dāng)我們切換到視圖窗口(Design)中查看時(shí),看到的是標(biāo)簽頂部居中顯示:

然后,當(dāng)我們運(yùn)行到手機(jī)上時(shí),確是這樣的:

如上所示,tools:layoutgravity= “center”確實(shí)在運(yùn)行后背拋棄掉了!

2.2蝇闭、tools:context開(kāi)發(fā)中查看Activity布局效果

context的用法,在后面跟一個(gè)Activtiy的完整包名,它有什么作用呢?

當(dāng)我們?cè)O(shè)置一個(gè)Activity主題時(shí),是在AndroidManifest.xml中設(shè)置中,而主題的效果又只能在運(yùn)行后在Activtiy中顯示

使用context屬性, 可以在開(kāi)發(fā)階段中看到設(shè)置在Activity中的主題效果

tools:context=”com.littlehan.myapplication.MainActivity”

在布局中加入這行代碼,就可以在design視圖中看到與MainActivity綁定主題的效果硬毕。

2.3呻引、tools:layout開(kāi)發(fā)中查看fragment布局效果

當(dāng)我們?cè)贏ctivity上加載一個(gè)fragment時(shí),是需要在運(yùn)行后才可以看到加載后的效果,有沒(méi)有方法在測(cè)試階段就在布局預(yù)覽窗口上顯示呢?

答案是有的,借助layout屬性,例如,在布局中加入這樣一行代碼:?

tools:layout=@layout/yourfragmentlayoutname?

這樣你的編寫(xiě)的fragment布局就會(huì)預(yù)覽在指定主布局上了

3吐咳、自定義命名空間

如果使用DataBinding 會(huì)在xml用到 app屬性逻悠,其實(shí)這是個(gè)自定義命名空間。

xmlns:app=”http://schemas.android.com/apk/res-auto

有朋友可能會(huì)問(wèn)了韭脊,這里哪里體現(xiàn)出是自定義的蹂风??

實(shí)際上也可以這么寫(xiě):?

xmlns:app=”http://schemas.android.com/apk/res/完整的包名”?

在res/后面填寫(xiě)包名即可乾蓬。但是惠啄,在Android Studio2.0上,是不推薦這么寫(xiě)的任内,所以建議大家還是用第一種的命名方法撵渡。

通常自定義命名空間往往是和自定義View分不開(kāi)的,當(dāng)Android自帶的控件不能滿足需求時(shí)死嗦,可以自己去繪制一些View趋距,而要為自定義View加上自定義的屬性時(shí),就需要?jiǎng)?chuàng)建自定義命名空間越除。

命名空間里面存放的是特定屬性的集合节腐,這樣一來(lái)外盯,思路就很清晰,也就是說(shuō)自定義命名空間的實(shí)際過(guò)程就是自定義屬性。

我們通過(guò)一個(gè)簡(jiǎn)單的自定義TextView來(lái)學(xué)習(xí)下自定義命名空間是怎么一回事翼雀,自定義View的過(guò)程可以分成以下幾個(gè)步驟:

3.1饱苟、繼承View類

創(chuàng)建一個(gè)類名為CustomTextView繼承View(View是所有視圖的父類)并實(shí)現(xiàn)它三個(gè)構(gòu)造方法

publicclassCustomTextViewextendsView{privatePaint mPaint =newPaint(Paint.ANTI_ALIAS_FLAG);//畫(huà)筆publicCustomTextView(Context context) {super(context);? ? }publicCustomTextView(Context context, AttributeSet attrs){this(context, attrs,0);//注意不是super(context,attrs,0);}publicCustomTextView(Context context, AttributeSet attrs,intdefStyleAttr){super(context,attrs,defStyleAttr);? ? }@OverrideprotectedvoidonDraw(Canvas canvas) {super.onDraw(canvas);? ? ? ? canvas.drawText("I am a CustomTextView",100,100, mPaint);? ? }}

3.2、 使用自定義布局

將自定義的控件引入布局

到了這里狼渊,一個(gè)自定義的控件就被引入布局使用了箱熬,我們可以切換到視圖窗口看看效果

但是這個(gè)自定義控件,并不能在xml中去改變字體顏色狈邑,字體大小城须、自定義文本等。這個(gè)功能的實(shí)現(xiàn)米苹,需要XML創(chuàng)建自定義屬性和在自定義View中解析屬性

3.3糕伐、自定義屬性

在values根目錄下新建一個(gè)名為attrs的xml文件來(lái)自定義屬性(自定義的屬性便是自定義命名空間里面的屬性)

name定義的是屬性的名字?

format定義的是屬性的類型

自定義屬性也可以不使用declare-styleable,參考這里

3.4蘸嘶、解析屬性

在CustomeTextView中解析這些屬性

publicclassCustomTextViewextendsView{privateintmColor = Color.RED;//默認(rèn)為紅色privateString mText="I am a Custom TextView";//默認(rèn)顯示該文本privatePaint mPaint =newPaint(Paint.ANTI_ALIAS_FLAG);//畫(huà)筆publicCustomTextView(Context context) {super(context);//? ? ? ? init();}publicCustomTextView(Context context, AttributeSet attrs){this(context, attrs,0);//注意不是super(context,attrs,0);init();? ? }publicCustomTextView(Context context, AttributeSet attrs,intdefStyleAttr){//解析自定義屬性super(context,attrs,defStyleAttr);? ? ? ? TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CustomTextView);? ? ? ? mColor = typedArray.getColor(R.styleable.CustomTextView_customColor, Color.RED);//? ? ? ? 如果沒(méi)有判斷赤炒,當(dāng)沒(méi)有指定該屬性而去加載該屬性app便會(huì)崩潰掉if(typedArray.getText(R.styleable.CustomTextView_customText) !=null){? ? ? ? ? ? mText = typedArray.getText(R.styleable.CustomTextView_customText).toString();? ? ? ? }? ? ? ? typedArray.recycle();//釋放資源init();? ? }privatevoidinit(){? ? ? ? mPaint.setColor(mColor);// 為畫(huà)筆添加顏色}@OverrideprotectedvoidonDraw(Canvas canvas) {super.onDraw(canvas);? ? ? ? canvas.drawText(mText,100,100, mPaint);? ? }}

3.5、使用自定義屬性

要使用自定義屬性亏较,就需要自定義屬性命名空間莺褒,在布局文件的根元素下插入這樣一行代碼:?

xmlns:app=”http://schemas.android.com/apk/res-auto

于是就可以使用自定義屬性了:

切換到視圖預(yù)覽窗口,可以看到自定義的屬性已經(jīng)生效了:

總結(jié)

在Android中雪情,命名空間可分為3種:

xmlns:android=”http://schemas.android.com/apk/res/android

xmlns:tools=”http://schemas.android.com/tools

xmlns:app=”http://schemas.android.com/apk/res-auto

其中遵岩,1和2命名空間里的屬性是系統(tǒng)封裝好的,第3種命名空間里的屬性是用戶自定義的

Android xmlns 的作用及其自定義?

Android中的命名空間

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巡通,一起剝皮案震驚了整個(gè)濱河市尘执,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宴凉,老刑警劉巖誊锭,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異弥锄,居然都是意外死亡丧靡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)籽暇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)温治,“玉大人,你說(shuō)我怎么就攤上這事戒悠“揪#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵绸狐,是天一觀的道長(zhǎng)卤恳。 經(jīng)常有香客問(wèn)我晴竞,道長(zhǎng)葬凳,這世上最難降的妖魔是什么鹦聪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任闽晦,我火速辦了婚禮,結(jié)果婚禮上本今,老公的妹妹穿的比我還像新娘。我一直安慰自己主巍,他們只是感情好冠息,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著孕索,像睡著了一般逛艰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搞旭,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天散怖,我揣著相機(jī)與錄音,去河邊找鬼肄渗。 笑死镇眷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翎嫡。 我是一名探鬼主播欠动,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惑申!你這毒婦竟也來(lái)了具伍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圈驼,失蹤者是張志新(化名)和其女友劉穎人芽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绩脆,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萤厅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靴迫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈坠。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矢劲,靈堂內(nèi)的尸體忽然破棺而出赦拘,到底是詐尸還是另有隱情,我是刑警寧澤芬沉,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布躺同,位于F島的核電站阁猜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蹋艺。R本人自食惡果不足惜剃袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捎谨。 院中可真熱鬧民效,春花似錦、人聲如沸涛救。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)检吆。三九已至舒萎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹭沛,已是汗流浹背臂寝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摊灭,地道東北人咆贬。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帚呼,于是被迫代替她去往敵國(guó)和親素征。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容