自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

每個(gè)安卓開發(fā)初學(xué)者應(yīng)該了解的12個(gè)技巧

移動(dòng)開發(fā) Android
在這篇文章里,我們將介紹一些初學(xué)者以及中級(jí)開發(fā)人員都應(yīng)該掌握的技巧,以幫助更好地理解安卓框架。后續(xù)我們還會(huì)在這個(gè)系列里寫更多這樣的關(guān)于實(shí)用技巧的文章。

[[207924]]

一次掌握一個(gè)技巧,更好地學(xué)習(xí)安卓

距離安迪·魯賓和他的團(tuán)隊(duì)著手開發(fā)一個(gè)希望顛覆傳統(tǒng)手機(jī)操作模式的操作系統(tǒng)已經(jīng)過去 12 年了,這套系統(tǒng)有可能讓手機(jī)或者智能機(jī)給消費(fèi)者以及軟件開發(fā)人員帶來全新的體驗(yàn)。之前的智能機(jī)僅限于收發(fā)短信和查看電子郵件(當(dāng)然還可以打電話),給用戶和開發(fā)者帶來很大的限制。

安卓,作為打破這個(gè)枷鎖的系統(tǒng),擁有非常優(yōu)秀的框架設(shè)計(jì),給大家提供的不僅僅是一組有限的功能,更多的是自由的探索。有人會(huì)說 iPhone 才是手機(jī)產(chǎn)業(yè)的顛覆產(chǎn)品,不過我們說的不是 iPhone 有多么酷(或者多么貴,是吧?),它還是有限制的,而這是我們從來都不希望有的。

不過,就像本大叔說的,能力越大責(zé)任越大,我們也需要更加認(rèn)真對待安卓應(yīng)用的設(shè)計(jì)方式。我看到很多教程都忽略了向初學(xué)者傳遞這個(gè)理念,在動(dòng)手之前請先充分理解系統(tǒng)架構(gòu)。他們只是把一堆的概念和代碼丟給讀者,卻沒有解釋清楚相關(guān)的優(yōu)缺點(diǎn),它們對系統(tǒng)的影響,以及該用什么不該用什么等等。

在這篇文章里,我們將介紹一些初學(xué)者以及中級(jí)開發(fā)人員都應(yīng)該掌握的技巧,以幫助更好地理解安卓框架。后續(xù)我們還會(huì)在這個(gè)系列里寫更多這樣的關(guān)于實(shí)用技巧的文章。我們開始吧。

1、 @+id 和 @id 的區(qū)別

要在 Java 代碼里訪問一個(gè)圖形控件(或組件),或者是要讓它成為其他控件的依賴,我們需要一個(gè)***的值來引用它。這個(gè)***值用 android:id 屬性來定義,本質(zhì)上就是把用戶提供的 id 附加到 @+id/ 后面,寫入到 id 資源文件,供其他控件使用。一個(gè) Toolbar 的 id 可以這樣定義,

  1. android:id="@+id/toolbar" 

然后這個(gè) id 值就能被 findViewById(…) 識(shí)別,這個(gè)函數(shù)會(huì)在資源文件里查找 id,或者直接從 R.id 路徑引用,然后返回所查找的 View 的類型。

而另一種,@id,和 findViewById(…) 行為一樣 - 也會(huì)根據(jù)提供的 id 查找組件,不過僅限于布局時(shí)使用。一般用來布置相關(guān)控件。

  1. android:layout_below="@id/toolbar" 

2、 使用 @string 資源為 XML 提供字符串

簡單來說,就是不要在 XML 里直接用字符串。原因很簡單。當(dāng)我們在 XML 里直接使用了字符串,我們一般會(huì)在其它地方再次用到同樣的字符串。想像一下當(dāng)我們需要在不同的地方調(diào)整同一個(gè)字符串的噩夢,而如果使用字符串資源就只改一個(gè)地方就夠了。另一個(gè)好處是,使用資源文件可以提供多國語言支持,因?yàn)榭梢詾椴煌恼Z言創(chuàng)建相應(yīng)的字符串資源文件。

  1. android:text="My Awesome Application" 

當(dāng)你直接使用字符串時(shí),你會(huì)在 Android Studio 里收到警告,提示說應(yīng)該把寫死的字符串改成字符串資源??梢渣c(diǎn)擊這個(gè)提示,然后按下 ALT + ENTER 打開字符串編輯。你也可以直接打開 res 目錄下的 values 目錄里的 strings.xml 文件,然后像下面這樣聲明一個(gè)字符串資源。

  1. <string name="app_name">My Awesome Application</string> 

然后用它來替換寫死的字符串,

  1. android:text="@string/app_name" 

3、 使用 @android 和 ?attr 常量

盡量使用系統(tǒng)預(yù)先定義的常量而不是重新聲明。舉個(gè)例子,在布局中有幾個(gè)地方要用白色或者 #ffffff 顏色值。不要每次都直接用 #ffffff 數(shù)值,也不要自己為白色重新聲明資源,我們可以直接用這個(gè),

  1. @android:color/white 

安卓預(yù)先定義了很多常用的顏色常量,比如白色,黑色或粉色。最經(jīng)典的應(yīng)用場景是透明色:

  1. @android:color/transparent 

另一個(gè)引用常量的方式是 ?attr,用來將預(yù)先定義的屬性值賦值給不同的屬性。舉個(gè)自定義 Toolbar 的例子。這個(gè) Toolbar 需要定義寬度和高度。寬度通??梢栽O(shè)置為 MATCH_PARENT,但高度呢?我們大多數(shù)人都沒有注意設(shè)計(jì)指導(dǎo),只是簡單地隨便設(shè)置一個(gè)看上去差不多的值。這樣做不對。不應(yīng)該隨便自定義高度,而應(yīng)該這樣做,

  1. android:layout_height="?attr/actionBarSize" 

?attr 的另一個(gè)應(yīng)用是點(diǎn)擊視圖時(shí)畫水波紋效果。SelectableItemBackground 是一個(gè)預(yù)定義的 drawable,任何視圖需要增加波紋效果時(shí)可以將它設(shè)為背景:

  1. android:background="?attr/selectableItemBackground" 

也可以用這個(gè):

  1. android:background="?attr/selectableItemBackgroundBorderless" 

來顯示無邊框波紋。

4、 SP 和 DP 的區(qū)別

雖然這兩個(gè)沒有本質(zhì)上的區(qū)別,但知道它們是什么以及在什么地方適合用哪個(gè)很重要。

SP 的意思是縮放無關(guān)像素,一般建議用于 TextView,首先文字不會(huì)因?yàn)轱@示密度不同而顯示效果不一樣,另外 TextView 的內(nèi)容還需要根據(jù)用戶設(shè)定做拉伸,或者只調(diào)整字體大小。

其他需要定義尺寸和位置的地方,可以使用 DP,也就是密度無關(guān)像素。之前說過,DP 和 SP 的性質(zhì)是一樣的,只是 DP 會(huì)根據(jù)顯示密度自動(dòng)拉伸,因?yàn)榘沧肯到y(tǒng)會(huì)動(dòng)態(tài)計(jì)算實(shí)際顯示的像素,這樣就可以讓使用 DP 的組件在不同顯示密度的設(shè)備上都可以擁有相同的顯示效果。

5、 Drawable 和 Mipmap 的應(yīng)用

這兩個(gè)最讓人困惑的是 - drawable 和 mipmap 有多少差異?

雖然這兩個(gè)好像有同樣的用途,但它們設(shè)計(jì)目的不一樣。mipmap 是用來儲(chǔ)存圖標(biāo)的,而 drawable 用于任何其他格式。我們可以看一下系統(tǒng)內(nèi)部是如何使用它們的,就知道為什么不能混用了。

你可以看到你的應(yīng)用里有幾個(gè) mipmap 和 drawable 目錄,每一個(gè)分別代表不同的顯示分辨率。當(dāng)系統(tǒng)從 drawable 目錄讀取資源時(shí),只會(huì)根據(jù)當(dāng)前設(shè)備的顯示密度選擇確定的目錄。然而,在讀取 mipmap 時(shí),系統(tǒng)會(huì)根據(jù)需要選擇合適的目錄,而不僅限于當(dāng)前顯示密度,主要是因?yàn)橛行﹩?dòng)器會(huì)故意顯示較大的圖標(biāo),所以系統(tǒng)會(huì)使用較大分辨率的資源。

總之,用 mipmap 來存放圖標(biāo)或標(biāo)記圖片,可以在不同顯示密度的設(shè)備上看到分辨率變化,而其它根據(jù)需要顯示的圖片資源都用 drawable。

比如說,Nexus 5 的顯示分辨率是 xxhdpi。當(dāng)我們把圖標(biāo)放到 mipmap 目錄里時(shí),所有 mipmap 目錄都將讀入內(nèi)存。而如果放到 drawable 里,只有 drawable-xxhdpi 目錄會(huì)被讀取,其他目錄都會(huì)被忽略。

6、 使用矢量圖形

為了支持不同顯示密度的屏幕,將同一個(gè)資源的多個(gè)版本(大小)添加到項(xiàng)目里是一個(gè)很常見的技巧。這種方式確實(shí)有用,不過它也會(huì)帶來一定的性能開支,比如更大的 apk 文件以及額外的開發(fā)工作。為了消除這種影響,谷歌的安卓團(tuán)隊(duì)發(fā)布了新增的矢量圖形。

矢量圖形是用 XML 描述的 SVG(可拉伸矢量圖形),是用點(diǎn)、直線和曲線組合以及填充顏色繪制出的圖形。正因?yàn)槭噶繄D形是由點(diǎn)和線動(dòng)態(tài)畫出來的,在不同顯示密度下拉伸也不會(huì)損失分辨率。而矢量圖形帶來的另一個(gè)好處是更容易做動(dòng)畫。往一個(gè) AnimatedVectorDrawable 文件里添加多個(gè)矢量圖形就可以做出動(dòng)畫,而不用添加多張圖片然后再分別處理。

  1. <vector xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:width="24dp"  
  3.     android:height="24dp"  
  4.     android:viewportWidth="24.0"  
  5.     android:viewportHeight="24.0"
  6.     <path android:fillColor="#69cdff" android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/> 
  7. </vector> 

上面的向量定義可以畫出下面的圖形, 

[[207925]] 

要在你的安卓項(xiàng)目里添加矢量圖形,可以右鍵點(diǎn)擊你項(xiàng)目里的應(yīng)用模塊,然后選擇 New >> Vector Assets。然后會(huì)打開 Assets Studio,你可以有兩種方式添加矢量圖形。***種是從 Material 圖標(biāo)里選擇,另一種是選擇本地的 SVG 或 PSD 文件。

谷歌建議與應(yīng)用相關(guān)都使用 Material 圖標(biāo),來保持安卓的連貫性和統(tǒng)一體驗(yàn)。這里有全部圖標(biāo),記得看一下。

7、 設(shè)定邊界的開始和結(jié)束

這是人們最容易忽略的地方之一。邊界!增加邊界當(dāng)然很簡單,但是如果要考慮支持很舊的平臺(tái)呢?

邊界的“開始”和“結(jié)束”分別是“左”和“右”的超集,所以如果應(yīng)用的 minSdkVersion 是 17 或更低,邊界和填充的“開始”和“結(jié)束”定義是舊的“左”/“右”所需要的。在那些沒有定義“開始”和“結(jié)束”的系統(tǒng)上,這兩個(gè)定義可以被安全地忽略。可以像下面這樣聲明:

  1. android:layout_marginEnd="20dp"
  2. android:paddingStart="20dp" 

8、 使用 Getter/Setter 生成工具

在創(chuàng)建一個(gè)容器類(只是用來簡單的存放一些變量數(shù)據(jù))時(shí)很煩的一件事情是寫多個(gè) getter 和 setter,復(fù)制/粘貼該方法的主體再為每個(gè)變量重命名。

幸運(yùn)的是,Android Studio 有一個(gè)解決方法??梢赃@樣做,在類里聲明你需要的所有變量,然后打開 Toolbar >> Code??旖莘绞绞?ALT + Insert。點(diǎn)擊 Code 會(huì)顯示 Generate,點(diǎn)擊它會(huì)出來很多選項(xiàng),里面有 Getter 和 Setter 選項(xiàng)。在保持焦點(diǎn)在你的類頁面然后點(diǎn)擊,就會(huì)為當(dāng)前類添加所有的 getter 和 setter(有需要的話可以再去之前的窗口操作)。很爽吧。

9、 使用 Override/Implement 生成工具

這是另一個(gè)很好用的生成工具。自定義一個(gè)類然后再擴(kuò)展很容易,但是如果要擴(kuò)展你不熟悉的類呢。比如說 PagerAdapter,你希望用 ViewPager 來展示一些頁面,那就需要定制一個(gè) PagerAdapter 并實(shí)現(xiàn)它的重載方法。但是具體有哪些方法呢?Android Studio 非常貼心地為自定義類強(qiáng)行添加了一個(gè)構(gòu)造函數(shù),或者可以用快捷鍵(ALT + Enter),但是父類 PagerAdapter 里的其他(虛擬)方法需要自己手動(dòng)添加,我估計(jì)大多數(shù)人都覺得煩。

要列出所有可以重載的方法,可以點(diǎn)擊 Code >> Generate and Override methods 或者 Implement methods,根據(jù)你的需要。你還可以為你的類選擇多個(gè)方法,只要按住 Ctrl 再選擇方法,然后點(diǎn)擊 OK。

10、 正確理解 Context

Context 有點(diǎn)恐怖,我估計(jì)許多初學(xué)者從沒有認(rèn)真理解過 Context 類的結(jié)構(gòu) - 它是什么,為什么到處都要用到它。

簡單地說,它將你能從屏幕上看到的所有內(nèi)容都整合在一起。所有的視圖(或者它們的擴(kuò)展)都通過 Context 綁定到當(dāng)前的環(huán)境。Context 用來管理應(yīng)用層次的資源,比如說顯示密度,或者當(dāng)前的關(guān)聯(lián)活動(dòng)?;顒?dòng)、服務(wù)和應(yīng)用都實(shí)現(xiàn)了 Context 類的接口來為其他關(guān)聯(lián)組件提供內(nèi)部資源。舉個(gè)添加到 MainActivity 的 TextView 的例子。你應(yīng)該注意到了,在創(chuàng)建一個(gè)對象的時(shí)候,TextView 的構(gòu)造函數(shù)需要 Context 參數(shù)。這是為了獲取 TextView 里定義到的資源。比如說,TextView 需要在內(nèi)部用到 Roboto 字體。這樣的話,TextView 需要 Context。而且在我們將 Context(或者 this)傳遞給 TextView 的時(shí)候,也就是告訴它綁定當(dāng)前活動(dòng)的生命周期。

另一個(gè) Context 的關(guān)鍵應(yīng)用是初始化應(yīng)用層次的操作,比如初始化一個(gè)庫。庫的生命周期和應(yīng)用是不相關(guān)的,所以它需要用 getApplicationContext() 來初始化,而不是用 getContext 或 this 或 getActivity()。掌握正確使用不同 Context 類型非常重要,可以避免內(nèi)存泄漏。另外,要用到 Context 來啟動(dòng)一個(gè)活動(dòng)或服務(wù)。還記得 startActivity(…) 嗎?當(dāng)你需要在一個(gè)非活動(dòng)類里切換活動(dòng)時(shí),你需要一個(gè) Context 對象來調(diào)用 startActivity 方法,因?yàn)樗?Context 類的方法,而不是 Activity 類。

  1. getContext().startActivity(getContext(), SecondActivity.class); 

如果你想了解更多 Context 的行為,可以看看這里或這里。***個(gè)是一篇關(guān)于 Context 的很好的文章,介紹了在哪些地方要用到它。而另一個(gè)是安卓關(guān)于 Context 的文檔,全面介紹了所有的功能 - 方法,靜態(tài)標(biāo)識(shí)以及更多。

獎(jiǎng)勵(lì) #1: 格式化代碼

有人會(huì)不喜歡整齊,統(tǒng)一格式的代碼嗎?好吧,幾乎我們每一個(gè)人,在寫一個(gè)超過 1000 行的類的時(shí)候,都希望我們的代碼能有合適的結(jié)構(gòu)。而且,并不僅僅大的類才需要格式化,每一個(gè)小模塊類也需要讓代碼保持可讀性。

使用 Android Studio,或者任何 JetBrains IDE,你都不需要自己手動(dòng)整理你的代碼,像增加縮進(jìn)或者 = 之前的空格。就按自己希望的方式寫代碼,在想要格式化的時(shí)候,如果是 Windows 系統(tǒng)可以按下 ALT + CTRL + L,Linux 系統(tǒng)按下 ALT + CTRL + SHIFT + L。代碼就自動(dòng)格式化好了

獎(jiǎng)勵(lì) #2: 使用庫

面向?qū)ο缶幊痰囊粋€(gè)重要原則是增加代碼的可重用性,或者說減少重新發(fā)明輪子的習(xí)慣。很多初學(xué)者錯(cuò)誤地遵循了這個(gè)原則。這條路有兩個(gè)方向,

  • 不用任何庫,自己寫所有的代碼。
  • 用庫來處理所有事情。

不管哪個(gè)方向走到底都是不對的。如果你徹底選擇***個(gè)方向,你將消耗大量的資源,僅僅是為了滿足自己擁有一切的驕傲。很可能你的代碼沒有做過替代庫那么多的測試,從而增加模塊出問題的可能。如果資源有限,不要重復(fù)發(fā)明輪子。直接用經(jīng)過測試的庫,在有了明確目標(biāo)以及充分的資源后,可以用自己的可靠代碼來替換這個(gè)庫。

而徹底走向另一個(gè)方向,問題更嚴(yán)重 - 別人代碼的可靠性。不要習(xí)慣于所有事情都依賴于別人的代碼。在不用太多資源或者自己能掌控的情況下盡量自己寫代碼。你不需要用庫來自定義一個(gè) TypeFaces(字體),你可以自己寫一個(gè)。

所以要記住,在這兩個(gè)極端中間平衡一下 - 不要重新創(chuàng)造所有事情,也不要過分依賴外部代碼。保持中立,根據(jù)自己的能力寫代碼。

這篇文章最早發(fā)布在 What’s That Lambda 上。請?jiān)L問網(wǎng)站閱讀更多關(guān)于 Android、Node.js、Angular.js 等等類似文章。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2020-09-06 08:19:11

Python編程語言開發(fā)

2012-05-22 14:38:04

2020-03-02 14:20:46

PythonGitHub編程語言

2009-06-15 13:17:37

Java初學(xué)者Java概念

2017-06-05 13:56:34

前端開發(fā)JavaScriptthis

2010-11-12 10:07:42

2020-09-18 09:02:20

JavaScript

2020-07-29 08:26:40

Webpack前端模塊

2020-12-07 10:55:16

編程學(xué)習(xí)技術(shù)

2011-07-11 17:45:13

java

2010-09-01 09:23:53

DIV CSS

2011-09-16 09:38:19

Emacs

2022-04-24 15:21:01

MarkdownHTML

2011-04-12 10:13:24

2014-01-03 14:09:57

Git學(xué)習(xí)

2024-08-17 12:14:06

2022-11-16 16:02:59

Linux命令

2010-08-24 08:28:19

JavaScript

2011-09-14 09:49:41

Android開發(fā)

2015-07-20 13:56:59

SDN
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)