1. 程式人生 > >Android一些不太常用XML檔案屬性的總結

Android一些不太常用XML檔案屬性的總結

前言

最近做的專案中XML用到了一些平時可能不是太常用的一些屬性,可能涉及都AndroidManifest.xml、佈局Layout檔案或者到具體的控制元件!

AndroidManifest.xml

在AndroidManifest.xml檔案中標籤中新增
<uses-sdk tools:overrideLibrary="xxx.xxx.aaa, xxx.xxx.bbb"/>
其中的xxx.xxx.xxx為第三方庫包名,如果存在多個庫,則用逗號分割它們。這樣做是為了專案中的AndroidManifest.xml和第三方庫的AndroidManifest.xml合併時可以忽略最低版本限制。

<application android:allowBackup="false">
是否允許備份應用的資料,預設是true,當備份資料的時候,它的資料會被備份下來。如果設為false,那麼絕對不會備份應用的資料,即使是備份整個系統。

<application android:supportsRtl="true">
Android現在提供了一些API,使您可以構建更優雅的變換佈局方向的使用者介面。這些介面將支援由右到左(RTL)的語言和閱讀方向。比如阿拉伯語和希伯來語。
為了使您的應用支援RTL佈局,需要在manifest檔案中設定元素的android:supportsRtl屬性為“true”。一旦啟用,該系統將啟用各種RTL API來用RTL佈局顯示您的應用。
如果用了這個屬性,有幾個問題需要注意:


1. 要求最低SDK版本號為17。
2. 將左——右方向的佈局屬性轉變為開始——結束方向的佈局屬性。

<application tools:replace="android:icon,android:label,android:name">
AS的Gradle外掛預設會啟用Manifest Merger Tool,若Library專案中也定義了與主專案相同的屬性(例如預設生成的android:icon和android:theme),則此時會合並失敗,並報錯。
這時就需要你在manifest.xml中加入上面一句屬性。

<service
    android:enabled
="true" android:exported="true" />

enabled屬性表示是否這個service能被系統例項化。如果能則為true,否則為false。預設為true。<application>元素有它自身的能應用到所有應用元件的enabled屬性,包括services。要是這個service要enabled,那麼這個<application><service>屬性都必須為true(它們都是預設值)。如果有一個為false,這個服務就會disabled;它就不會被例項化。
exported屬性表示是否其它應用元件能呼叫這個service或同它互動,如果能則為true,否則為false。當值為false時,只有同一個應用的元件或有相同使用者ID的應用能啟動這個服務或繫結它。
預設值依賴於服務是否包含intent filters。過濾器的缺失意味著它只能通過指定它準確類名來呼叫它。這就意味著這個服務只能在應用內部被使用(因為其它應用不知道類名)。因此,在這種情況下,預設值是false。另一方面,至少有一個過濾器意味著這個服務可以在外部被使用,因此,預設值為true。

<activity
     android:excludeFromRecents="true"
     tools:ignore="ExportedActivity">

excludeFromRecents屬性表示控制在不在recent列表中顯示。true時不顯示;false顯示,預設。
tools:ignore=”ExportedActivity”表示允許所有的應用使用它。

⑦intent-filter下的data標籤

<data android:mimeType="*/*" />
<data android:scheme="file" />
<data android:host="*" />
<data android:path="*"/>
<data android:pathPrefix="*"/>
<data android:port="*"/>
<data android:pathPattern=".*..*..*..*..*.vpn" />

這個標籤元素用於把資料規範新增到一個Intent過濾器中,資料規範能夠只是資料型別(mimeType屬性)、或資料位置標識(URI),也可以是資料型別和資料位置標識(URI)。一個URI(如下格式)被分成幾個獨立的屬性來分別指定:
scheme://host:port/path or pathPrefix or pathPattern
這些屬性是可選的,但也是相互依賴的。如果沒有給Intent過濾器指定scheme屬性,那麼所有其他的URI屬性都會被忽略。如果沒有給過濾器指定host屬性,那麼port屬性和所有的路徑屬性都會被忽略。
包含在同一個intent-filter元素中所有的data元素只會對這個過濾器起作用。

mimeType
多用途網際網路郵件擴充套件(MIME,Multipurpose Internet Mail Extensions), 它的作用是告訴Android系統本Activity可以處理的檔案的型別。
格式:[type]/[subtype]
type有下面的形式:

Text:用於標準化地表示的文字資訊,文字訊息可以是多種字符集和或者多種格式的;
Multipart:用於連線訊息體的多個部分構成一個訊息,這些部分可以是不同型別的資料;
Application:用於傳輸應用程式資料或者二進位制資料;
Message:用於包裝一個E-mail訊息;
Image:用於傳輸靜態圖片資料;
Audio:用於傳輸音訊或者音聲資料;
Video:用於傳輸動態影像資料,可以是與音訊編輯在一起的視訊資料格式。

subtype用於指定type的詳細形式。content-type/subtype配對的集合和與此相關的引數,將隨著時間而增長。為了確保這些值在一個有序而且公開的狀態下開發,MIME使用Internet Assigned Numbers Authority (IANA)作為中心的註冊機制來管理這些值。常用的subtype值如下所示:

text/plain(純文字)
text/html(HTML文件)
application/xhtml+xml(XHTML文件)
image/gif(GIF影象)
image/jpeg(JPEG影象)【PHP中為:image/pjpeg】
image/png(PNG影象)【PHP中為:image/x-png】
video/mpeg(MPEG動畫)
application/octet-stream(任意的二進位制資料)
application/pdf(PDF文件)
application/msword(Microsoft Word檔案)
message/rfc822(RFC 822形式)
multipart/alternative(HTML郵件的HTML形式和純文字形式,相同內容使用不同形式表示)
application/x-www-form-urlencoded(使用HTTP的POST方法提交的表單)
multipart/form-data(同上,但主要用於表單提交時伴隨檔案上傳的場合)

host
這個屬性使用者定義URI授權的主機部分,除非給過濾器也指定了<data>元素的scheme屬性,否則這個屬性沒有意義。
注意:在Android框架中,主機名的匹配是大小寫敏感的,跟RFC格式不一樣。因此,要始終使用小寫字母來指定主機名。

path/pathPrefix/pathPattern
這個三個屬性用於指定URI的路徑部分。Path屬性指定一個完整的路徑,這個路徑會跟Intent物件中的路徑進行匹配。PathPrefix屬性只指定了部分路徑,它會跟Intent物件中的路徑初始部分匹配。pathPattern屬性指定一個要跟Intent物件中的路徑進行匹配的完整路徑,但是這個路徑中可以包含下列萬用字元:
1. 星號*萬用字元,路徑中的星號代表任意多個星號之前的那個字元,如a*,可跟a、aa、aaa、aaaa、…字串匹配。
2. 點跟星號的組合.*萬用字元,它可以跟任意字串進行匹配,如.*html,可以跟abchhtml、chtml、html、dssf.html、…等字串匹配。

因為系統讀取XML中的字串時,會把’\’符號作為強制轉義字元,因此就需要兩次轉義。例如,符號”*”要被寫成”\\*”,符號’\’要被寫成”\\\\”。這與Java程式碼中的寫法基本相同。

port
這個屬性用於定義URI授權的埠部分。只有給過濾器指定了scheme和host屬性時,這個屬性才有意義。

scheme
這個屬性用於設定URI的scheme部分。它是給指定URI設定的最基本的屬性,至少要給過濾器設定一個scheme屬性,否則,其他的URI屬性就沒有意義了。
scheme屬性值沒有”:”符號結尾(如http,而不是http: )
如果過濾器有一個數據型別(設定了mimeType屬性),但沒有設定scheme屬性,那麼系統就會假定scheme是content:和file:
注意:在Android框架中,scheme的匹配時大小寫敏感的,跟RFC格式不一樣。因此,要始終使用小寫字母來指定scheme。

<meta-data/>標籤
meta-data就像其名一樣,主要用來定義一些元件相關的配置值。
按照官方定義,metadata是一組供父元件使用的名值對(name-value pair),因此相應的meta-data元素應該定義在相應的元件中。即如果想在activity中使用metadata,那麼meta-data必須定義在AndroidManifest.xml的activity宣告中。
使用:

<meta-data
    android:name="com.yt.key"
    android:value="@string/value" />

然後在程式碼中得到我們的值:

//在Activity應用<meta-data>元素。
ActivityInfo info = this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");

//在application應用<meta-data>元素。
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
appInfo.metaData.getString("meta_name");

//在service應用<meta-data>元素。
ComponentName cn = new ComponentName(this,MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");

//在receiver應用<meta-data>元素。
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");

layout.xml

①在佈局或者控制元件中加入tools:context

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

tools:context="activity name"這一句不會被打包進APK。只是ADT的Layout Editor在你當前的Layout檔案裡面設定對應的渲染上下文,說明你當前的Layout所在的渲染上下文是activity name對應的那個activity,如果這個activity在manifest檔案中設定了Theme,那麼ADT的Layout Editor會根據這個Theme來渲染你當前的Layout。就是說如果你設定的MainActivity設定了一個Theme.Light(其他的也可以),那麼你在視覺化佈局管理器裡面看到的背景阿控制元件阿什麼的就應該是Theme.Light的樣子。僅用於給你看所見即所得的效果而已。

②抽象佈局標籤

使用抽象佈局標籤(include, viewstub, merge)主要是為了優化佈局!、去除不必要的巢狀和View節點、減少不必要的infalte及其他Layout方面可調優點。

<include/>標籤

include標籤常用於將佈局中的公共部分提取出來供其他layout共用,以實現佈局模組化,這在佈局編寫方便提供了大大的便利。
用法:
<include layout="@layout/title.xml" />
include標籤唯一需要的屬性是layout屬性,指定需要包含的佈局檔案。可以定義android:id和android:layout_*屬性來覆蓋被引入佈局根節點的對應屬性值。

<viewstub/>標籤

viewstub標籤同include標籤一樣可以用來引入一個外部佈局,不同的是,viewstub引入的佈局預設不會擴張,即既不會佔用顯示也不會佔用位置,從而在解析layout時節省cpu和記憶體。
viewstub常用來引入那些預設不會顯示,只在特殊情況下顯示的佈局,如進度佈局、網路失敗顯示的重新整理佈局、資訊出錯出現的提示佈局等。
用法:

<ViewStub
        android:id="@+id/layout_error"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout="@layout/network_error" />

其中network_error.xml為只有在網路錯誤時才需要顯示的佈局,預設不會被解析。
當我們要使用的時候,有兩種方法可以使用,效果是一樣的:

((ViewStub) findViewById(R.id.layout_error)).setVisibility(View.VISIBLE);  
// 或者 
View importPanel = ((ViewStub) findViewById(R.id.layout_error)).inflate();  

2017/10/10更新
好多同學在使用ViewStub的時候被裡邊的各種id搞暈了,這裡說一下!

  • id 指的就是viewstub這個view的id,因為viewstub本身就是一個輕量級的view,只是比較特殊!這個id就跟一般view的id一樣!
  • layout 你要往viewstub裡邊載入的佈局layout名稱!
  • infltedId ViewStub載入要展示的layout之後這個view的id,因為當ViewStub載入你要展示的layout之後,它就被銷燬了,不存在了!所以如果你想要得到載入layout中的某一個view,你去findViewById的時候,要先使用inflatedId去拿到載入之後的view的例項!

<merge/>標籤

在使用了include後可能導致佈局巢狀過多,多餘不必要的layout節點,從而導致解析變慢,不必要的節點和巢狀可通過hierarchy viewer或設定->開發者選項->顯示佈局邊界檢視。merge標籤在UI的結構優化中起著非常重要的作用,它可以刪減多餘的層級,優化UI。
merge多用於替換FrameLayout或者當一個佈局包含另一個時,merge標籤消除檢視層次結構中多餘的檢視組。

merge標籤可用於兩種典型情況:
a. 佈局頂結點是FrameLayout且不需要設定background或padding等屬性,可以用merge代替,因為Activity內容檢視的parent view就是個FrameLayout,所以可以用merge消除只剩一個。
b. 某佈局作為子佈局被其他佈局include時,使用merge當作該佈局的頂節點,這樣在被引入時頂結點會自動被忽略,而將其子節點全部合併到主佈局中。

用法:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">  

    <!--具體的佈局內容-->    

</merge> 

控制元件

①TextView

<!--設定文字的外觀,這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用預設的外觀-->

android:textAppearance="?android:attr/XXXX"
<!--設定文字過長時,該如何顯示,"start"—–省略號顯示在開頭;
"end"——省略號顯示在結尾;"middle"—-省略號顯示在中間;
"marquee" ——以跑馬燈 的方式顯示(動畫 橫向移動)-->

android:ellipsize="start"
<!--設定字形,如bold粗體,italic傾斜-->
android:textStyle="bold"

②EditText

android:imeActionId="@+id/login"
android:imeActionLabel="@string/sign_in"
android:imeOptions="actionUnspecified"

這三個屬性是對軟鍵盤右下角的回車鍵的功能進行設定,然後在程式碼中重寫onEditorAction()方法,引數中的actionId對應的就是imeOption屬性中設定的值。

<!--設定EditText游標的顏色,如果為@null,則設定成與文字顏色一樣-->
android:textCursorDrawable="@null"

③ListView

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

<!--when listview has no data,show the below layout. because set android:id/empty-->
<LinearLayout
    android:id="@android:id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ProgressBar
        android:layout_width="wrap_content"                              android:layout_height="wrap_content"                             style="?android:attr/progressBarStyleLarge"/>
     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Loading the profile,please wait"/>
</LinearLayout>

如果繼承ListActivity,當你在listview下加了一個佈局,且設定android:id="@android:id/empty",則該佈局只會在listview沒有資料的時候顯示!!!

相關推薦

Android一些常用XML檔案屬性總結

前言 最近做的專案中XML用到了一些平時可能不是太常用的一些屬性,可能涉及都AndroidManifest.xml、佈局Layout檔案或者到具體的控制元件! AndroidManifest.xml ①在AndroidManifest.xml檔案中標籤

【PB】PowerBuilder中的一些常用的方法

25、Shutdown from application [PB external function declaration] FUNCTION boolean ExitWindowsEx(ulong uFlags, long dwReserved ) & LIBRARY 'user32.dll' [

EditText常用又用得到的東西

1.站位文字 android:hint="請輸入賬號” 2.取消下劃線 android:background="@null” 3.設定輸入型別(密碼,數字,電話號等) android:inputType=“textPassword” 4.設定鍵盤return按鈕顯示型別(搜尋

android工程自動更新R檔案的問題解決

        今天兩次遇到R檔案不更新,進而消失的問題。上一篇博文中說更換了workspace就解決了。但是晚上有碰到了,又去網上找(因為不想再換工作空間了)。於是找到了一篇有用的。跟大家分享一下:  &nb

springboot專案mybatis打jar包搭邊xml檔案

使用springboot 載入mybatis,打包成功,結果在測試伺服器上一直報org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):  經過排查,結果是jar中沒有打包mybat

springboot打成jar包,找到mapper.xml檔案

最近在使用springboot的時候,專案在本地可以執行,打成jar包放到伺服器說是沒有找到mapper.xml檔案,網上找了好久沒找到。 最後解壓jar包發現mapper.xml檔案沒有打進去。 把pom檔案中的打包外掛改成 <build>       

關於android studio的layout的xml檔案的建立

1.第一步在android studio的project檢視模式下右擊res資料夾 2.然後找到New --> Android resources file選項,點選進入,按照

Android中使用pull解析xml檔案

Android解析xml檔案的時候,自己推薦是使用pull的方式來解析xml資原始檔,pull方式又有兩種,分別是XmlPullParser和XmlResourceParser兩種。下面來分別介紹。 一: XmlPullParser方式進行佈局解析。

myeclipse 打開struts.xml檔案

如: 這是由於你myeclipse裡面的struts.xml的外掛格式與你要開啟的檔案不一樣。可以這樣開啟(右鍵struts.xml——》Open With——》MyEclipse XML Edi

1分鐘搞定Android開發智慧提示問題xml檔案一併搞定

eclipse 搭建的Android開發環境,但是開發起來發現IDE的提示功能不是很理想,樂居貓在此總結了一下,1分鐘內,2步搞定!如下:1.設定.java檔案的提示將紅框中的值設定為:.abcdefghigklmnopqrstuvwxyz這樣輸入任何小寫字母都能喚出提示了

saiku 3.8 二次開發報錯之Could not start repo 找到configuration.xml檔案

在saiku3.8的二次開發版本中,由於執行環境的特殊性,經常會遇到一些問題,但是不是莫名其妙,而是有依據可循的,下面來看下找不到檔案“configuration.xml”的解決辦法:報錯資訊10:29:39,422 ERROR [RepositoryDatasourceMa

Android 中使用Pull解析XML檔案

解析XML檔案是非常常用的功能,在Android客戶端中,經常與伺服器通訊都需要xml檔案的支援,我們這裡介紹一個 簡單的xml檔案的解析,就是使用android中的pull方法進行解析。在java中,有dom解析和sax解析,這個pull解析有些類 似於sax解析,他也是

Android學習筆記(9):使用XML檔案和Java程式碼控制UI介面

Android推薦使用XML檔案設定UI介面,然後用Java程式碼控制邏輯部分,這體現了MVC思想。 MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資

Spring 關於MyEclipse下建立Maven專案找到application.xml檔案的處理方法

博主之前沒有用maven建立專案的時候,application.xml檔案是放在src資料夾下的,web.xml配置檔案也找得到。後來因為專案問題,又重新用maven新建了專案,檔案的位置什麼的都沒變,但web.xml這個檔案就是找不到application.xml配置檔案。

AndroidManifest.xml檔案屬性詳解

一、AndroidManifest.xml檔案是每個安卓程式都必備的檔案,它位於專案的根目錄下。它用來描述安卓程式的包名、版本、各個元件(Activity/Service等)、註冊軟體使用的許可權等等。 二、AndroidManifest.xml結構 &

cocostudio中有一些適應的功能

之前用cocostudio來做uI介面,初次使用有很多不適應,可是慢慢適應後發現升級後的又不太適應了。 之前呼叫widget的getChildByName的時候,是搜尋所有子節點和子節點中的子節點,是遞迴搜尋進行的,初次使用的時候以為是bug,鬱悶了好長一段時間,後來用

Maven專案打包*.hbm.xml檔案

<build> <pluginManagement> <plugins> <plugin> <groupI

解決使用intellij idea開發MAVEN專案在target目錄下存在mapper.xml檔案

這個問題卡了我一上午的時間,由於不服輸的性格,導致必須幹掉他,查了各種資料,問了各種人終於讓我找到這位老兄的部落格 原本在Eclipse中好好的MAVEN專案,匯入intellij idea中,伺服器啟動正常,但在呼叫userMapper介面時,報以下異常:

Android studio應用的AndroidManifest.xml檔案中跟庫中出現相同的配置解決方案

問題描述 Error:(26, 9) Attribute application@icon value=(@drawable/logo) from AndroidManifest.xml:26:

菜鳥學習從入門到放棄(一)關於動態規劃一些成熟的小理解

最近,碰到很多動態規劃的題目,看書自學了點相關知識,分享給大家,水平有限,歡迎指正。我只是知識的搬運工,當然其中夾雜一些自己不成熟的理解。 動態規劃常用於求解最優化問題。比較典型的有:鋼條切割問題、矩陣鏈乘法、最長公共子序列、字串的交替連結和子序列數目等問題。下面從概念以及