編輯:關於android開發
最近做的項目中XML用到了一些平時可能不是太常用的一些屬性,可能涉及都AndroidManifest.xml、布局Layout文件或者到具體的控件!
①在AndroidManifest.xml文件中標簽中添加
,
其中的xxx.xxx.xxx為第三方庫包名,如果存在多個庫,則用逗號分割它們。這樣做是為了項目中的AndroidManifest.xml和第三方庫的AndroidManifest.xml合並時可以忽略最低版本限制。
②
是否允許備份應用的數據,默認是true,當備份數據的時候,它的數據會被備份下來。如果設為false,那麼絕對不會備份應用的數據,即使是備份整個系統。
③
Android現在提供了一些API,使您可以構建更優雅的變換布局方向的用戶界面。這些界面將支持由右到左(RTL)的語言和閱讀方向。比如阿拉伯語和希伯來語。
為了使您的應用支持RTL布局,需要在manifest文件中設置元素的android:supportsRtl屬性為“true”。一旦啟用,該系統將啟用各種RTL API來用RTL布局顯示您的應用。
如果用了這個屬性,有幾個問題需要注意:
1. 要求最低SDK版本號為17。
2. 將左——右方向的布局屬性轉變為開始——結束方向的布局屬性。
④
AS的Gradle插件默認會啟用Manifest Merger Tool,若Library項目中也定義了與主項目相同的屬性(例如默認生成的android:icon和android:theme),則此時會合並失敗,並報錯。
這時就需要你在manifest.xml中加入上面一句屬性。
⑤
enabled屬性表示是否這個service能被系統實例化。如果能則為true,否則為false。默認為true。元素有它自身的能應用到所有應用組件的enabled屬性,包括services。要是這個service要enabled,那麼這個
和
屬性都必須為true(它們都是默認值)。如果有一個為false,這個服務就會disabled;它就不會被實例化。
exported屬性表示是否其它應用組件能調用這個service或同它交互,如果能則為true,否則為false。當值為false時,只有同一個應用的組件或有相同用戶ID的應用能啟動這個服務或綁定它。
默認值依賴於服務是否包含intent filters。過濾器的缺失意味著它只能通過指定它准確類名來調用它。這就意味著這個服務只能在應用內部被使用(因為其它應用不知道類名)。因此,在這種情況下,默認值是false。另一方面,至少有一個過濾器意味著這個服務可以在外部被使用,因此,默認值為true。
⑥
excludeFromRecents屬性表示控制在不在recent列表中顯示。true時不顯示;false顯示,默認。
tools:ignore=”ExportedActivity”表示允許所有的應用使用它。
⑦intent-filter下的data標簽
<code class=" hljs xml"><data android:mimetype="*/*"> <data android:scheme="file"> <data android:host="*"> <data android:path="*"> <data android:pathprefix="*"> <data android:port="*"> <data android:pathpattern=".*..*..*..*..*.vpn"></data></data></data></data></data></data></data></code>
這個標簽元素用於把數據規范添加到一個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授權的主機部分,除非給過濾器也指定了元素的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就像其名一樣,主要用來定義一些組件相關的配置值。
按照官方定義,metadata是一組供父組件使用的名值對(name-value pair),因此相應的meta-data元素應該定義在相應的組件中。即如果想在activity中使用metadata,那麼meta-data必須定義在AndroidManifest.xml的activity聲明中。
使用:
然後在代碼中得到我們的值:
//在Activity應用元素。
ActivityInfo info = this.getPackageManager().getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
//在application應用元素。
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
appInfo.metaData.getString("meta_name");
//在service應用元素。
ComponentName cn = new ComponentName(this,MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
//在receiver應用元素。
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
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標簽常用於將布局中的公共部分提取出來供其他layout共用,以實現布局模塊化,這在布局編寫方便提供了大大的便利。
用法:
include標簽唯一需要的屬性是layout屬性,指定需要包含的布局文件。可以定義android:id和android:layout_*屬性來覆蓋被引入布局根節點的對應屬性值。
標簽viewstub標簽同include標簽一樣可以用來引入一個外部布局,不同的是,viewstub引入的布局默認不會擴張,即既不會占用顯示也不會占用位置,從而在解析layout時節省cpu和內存。
viewstub常用來引入那些默認不會顯示,只在特殊情況下顯示的布局,如進度布局、網絡失敗顯示的刷新布局、信息出錯出現的提示布局等。
用法:
其中network_error.xml為只有在網絡錯誤時才需要顯示的布局,默認不會被解析。
當我們要使用的時候,有兩種方法可以使用,效果是一樣的:
((ViewStub) findViewById(R.id.layout_error)).setVisibility(View.VISIBLE);
// 或者
View importPanel = ((ViewStub) findViewById(R.id.layout_error)).inflate();
標簽在使用了include後可能導致布局嵌套過多,多余不必要的layout節點,從而導致解析變慢,不必要的節點和嵌套可通過hierarchy viewer或設置->開發者選項->顯示布局邊界查看。merge標簽在UI的結構優化中起著非常重要的作用,它可以刪減多余的層級,優化UI。
merge多用於替換FrameLayout或者當一個布局包含另一個時,merge標簽消除視圖層次結構中多余的視圖組。
merge標簽可用於兩種典型情況:
a. 布局頂結點是FrameLayout且不需要設置background或padding等屬性,可以用merge代替,因為Activity內容視圖的parent view就是個FrameLayout,所以可以用merge消除只剩一個。
b. 某布局作為子布局被其他布局include時,使用merge當作該布局的頂節點,這樣在被引入時頂結點會自動被忽略,而將其子節點全部合並到主布局中。
用法:
①TextView
android:textAppearance="?android:attr/XXXX"
android:ellipsize="start"
android:textStyle="bold"
②EditText
android:imeActionId="@+id/login"
android:imeActionLabel="@string/sign_in"
android:imeOptions="actionUnspecified"
這三個屬性是對軟鍵盤右下角的回車鍵的功能進行設置,然後在代碼中重寫onEditorAction()方法,參數中的actionId對應的就是imeOption屬性中設置的值。
android:textCursorDrawable="@null"
【Android】常見問題解答,android這裡匯總了用C#和VS2015開發Android App時一些常見的最基本的問題及解決辦法,以後有新的問題時都在這裡一並回答
EditText 關於控件的一些技巧 1.避免EditText輸入日期時的驗證 當在EditText輸入日期時,通常需要對輸入的日期進行驗證,然而我們可以用Butto
Android 加載大圖片到內存,本文演示android中圖片加載到內存 首先設計界面: 代碼如下: <LinearLayout xmlns:android=h
Apktool(4)——實戰篇:修改小米桌面,apktool實戰篇准備工作: 1.下載對應手機型號線刷Rom包,進入小米官網Rom下載頻道 2.解壓下載下來的Rom包,並