Android develop tricks——整理自國外的一些Blog

weixin_34119545發表於2016-03-26

ViewDragHelper ——檢視拖動是一個比較複雜的問題。這個類能夠幫助解決不少問題。假設你須要一個樣例,DrawerLayout就是利用它實現掃滑。Flavient Laurent 還寫了一些關於這方面的優秀文章

PopupWindow——Android到處都在使用PopupWindow 。甚至你都沒有意識到(標題導航條ActionBar。自己主動補全AutoComplete,編輯框錯誤提醒Edittext Errors)。這個類是建立浮層內容的主要方法。

Actionbar.getThemrContext()——導航欄的主題化是非常複雜的(不同於Activity其它部分的主題化)。你能夠得到一個上下文(Context),用這個上下文建立的自己定義元件能夠得到正確的主題。

ThumbnailUtils——幫助建立縮圖。通常我都是用現有的圖片載入庫(比方,Picasso 或者 Volley),只是這個ThumbnaiUtils能夠建立視訊縮圖。譯者注:該API從V8才開始支援。

Context.getExternalFilesDir()———— 申請了SD卡寫許可權後。你能夠在SD的不論什麼地方寫資料,把你的資料寫在設計好的合適位置會更加有禮貌。

這樣資料能夠及時被清理,也會有更好的使用者體驗。此外。Android 4.0 Kitkat中在這個目錄下寫資料是不須要許可權的。每一個使用者有自己的獨立的資料儲存路徑。譯者注:該API從V8才開始支援。

SparseArray——Map的高效優化版本號。推薦瞭解姐妹類SparseBooleanArray、SparseIntArray和SparseLongArray。

PackageManager.setComponentEnabledSetting()——能夠用來啟動或者禁用程式清單中的元件。對於關閉不須要的功能元件是非常讚的,比方關掉一個當前不用的廣播接收器。

SQLiteDatabase.yieldIfContendedSafely()——讓你臨時停止一個資料庫事務, 這樣你能夠就不會佔用太多的系統資源。

Environment.getExternalStoragePublicDirectory()——還是那句話。使用者期望在SD卡上得到統一的使用者體驗。用這種方法能夠獲得在使用者裝置上放置指定型別檔案(音樂、圖片等)的正確目錄。

View.generateViewId()——每次我都想要推薦動態生成控制元件的ID。

須要注意的是,不要和已經存在的控制元件ID或者其它已經生成的控制元件ID反覆。

ActivityManager.clearApplicationUserData()—— 一鍵清理你的app產生的使用者資料,可能是做使用者退出登入功能,有史以來最簡單的方式了。

Context.createConfigurationContext() ——自己定義你的配置環境資訊。我一般會遇到這種問題:強制讓一部分顯示在某個特定的環境下(倒不是我一直這樣瞎整,說來話長,你非常難理解)。用這個實現起來能夠略微簡單一點。

ActivityOptions ——方便的定義兩個Activity切換的動畫。

使用ActivityOptionsCompat 能夠非常好解決舊版本號的相容問題。

AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()——僅僅由於非常好玩。沒有其它原因。

在整個安卓開源專案中(AOSP the Android ——pen Source Project Android開放原始碼專案)中還有其它非常有意思的東西(比方
GRAVITY_DEATH_STAR_I)。只是,都不像這個這樣。這個確實有用

ViewParent.requestDisallowInterceptTouchEvent() ——Android系統觸控事件機制大多時候能夠預設處理,只是有時候你須要使用這種方法來剝奪父級控制元件的控制權(順便說一下,假設你想對Android觸控機制瞭解很多其它,這個演講會令你驚歎不已。

Activity.isChangingConfigurations ()——假設在 Activity 中 configuration 會常常改變的話,使用這種方法就能夠不用手動做儲存狀態的工作了。

SearchRecentSuggestionsProvider——能夠建立近期提示效果的 provider。是一個簡單高速的方法。

ViewTreeObserver——這是一個非常棒的工具。能夠進入到 VIew 裡面,並監控 View 結構的各種狀態,通常我都用來做 View 的測量操作(自己定義檢視中常常常使用到)。

org.gradle.daemon=true——這句話能夠幫助降低 Gradle 構建的時間。僅在命令列編譯的時候用到,由於 Android Studio 已經這樣使用了。

DatabaseUtils——一個包括各種資料庫操作的使用工具。

android:weightSum (LinearLayout)——假設想使用 layout weights,可是卻不想填充整個 LinearLayout 的話,就能夠用 weightSum 來定義總的 weight 大小。

android:duplicateParentState (View)——此方法能夠使得子 View 能夠複製父 View 的狀態。

比方假設一個 ViewGroup 是可點選的,那麼能夠用這種方法在它被點選的時候讓它的子 View 都改變狀態。

android:clipChildren (ViewGroup)——假設此屬性設定為不可用。那麼 ViewGroup 的子 View 在繪製的時候會超出它的範圍。在做動畫的時候須要用到。

android:fillViewport (ScrollView)——在這片文章中有具體介紹文章連結。能夠解決在 ScrollView 中當內容不足的時候填不滿螢幕的問題。

android:tileMode (BitmapDrawable)——能夠指定圖片使用反覆填充的模式。

android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具有多種狀態的時候,能夠定義它展示前的淡入淡出效果。

android:scaleType (ImageView)——定義在 ImageView 中怎麼縮放/剪裁圖片,一般用的比較多的是“centerCrop”和“centerInside”。

Merge——此標籤能夠在還有一個佈局檔案裡包括別的佈局檔案。而不用再新建一個 ViewGroup。對於自己定義 ViewGroup 的時候也須要用到。能夠通過載入一個帶有標籤的佈局檔案來自己主動定義它的子部件。

AtomicFile——通過使用備份檔案進行檔案的原子化操作。這個知識點之前我也寫過,只是不妨有出一個官方的版本號比較好

UrlQuerySanitizer——使用這個工具能夠方便對 URL 進行檢查。

Fragment.setArguments——由於在構建 Fragment 的時候不能加引數。所以這是個非常好的東西。能夠在建立 Fragment 之前設定引數(即使在 configuration 改變的時候仍然會導致銷燬/重建)。

DialogFragment.setShowsDialog ()—— 這是一個非常巧妙的方式,DialogFragment 能夠作為正常的 Fragment 顯示!這裡能夠讓 Fragment 承擔雙重任務。我通常在建立 Fragment 的時候把 onCreateView ()和 onCreateDialog ()都加上。就能夠建立一個具有雙重目的的 Fragment。

FragmentManager.enableDebugLogging ()——在須要觀察 Fragment 狀態的時候會有幫助。

LocalBroadcastManager——這個會比全域性的 broadcast 更加安全,簡單,高速。

像 otto 這種 Event buses 機制對你的應用場景更加有用。

PhoneNumberUtils.formatNumber ()——顧名思義,這是對數字進行格式化操作的時候用的。

Region.op()——我發如今對照兩個渲染之前的區域的時候非常有用,假設你有兩條路徑,那麼怎麼知道它們是不是會重疊呢?使用這種方法就能夠做到。

Application.registerActivityLifecycleCallbacks——儘管缺少官方文件解釋,只是我想它就是註冊 Activity 的生命週期的一些回撥方法(顧名思義),就是一個方便的工具。

versionNameSuffix——這個 gradle 設定能夠讓你在基於不同構建型別的 manifest 中改動版本號名這個屬性。比如。假設須要在在 debug 版本號中以”-SNAPSHOT”結尾,那麼就能夠輕鬆的看出當前是 debug 版還是 release 版。

CursorJoiner——假設你是僅僅使用一個資料庫的話,使用 SQL 中的 join 就能夠了,可是假設收到的資料是來自兩個獨立的 ContentProvider,那麼 CursorJoiner 就非常有用了。

Genymotion——一個非常快的 Android 模擬器。本人一直在用。

-nodpi——在沒有特別定義的情況下。非常多修飾符(-mdpi,-hdpi,-xdpi等等)都會預設自己主動縮放 assets/dimensions,有時候我們須要保持顯示一致,這種情況下就能夠使用 -nodpi。

BroadcastRecevier.setDebugUnregister ()——又一個方便的除錯工具。

Activity.recreate ()——強制讓 Activity 重建。

PackageManager.checkSignatures ()——假設同一時候安裝了兩個 app 的話,能夠用這種方法檢查。

假設不進行簽名檢查的話,其它人能夠輕易通過使用一樣的包名來模仿你的 app。

DateUtils.formatDateTime() 用來進行區域格式化工作。輸出格式化和本地化的時間或者日期。

AlarmManager.setInexactRepeating 通過鬧鈴分組的方式省電,即使你僅僅呼叫了一個鬧鐘,這也是一個好的選擇。(能夠確保在使用完成時自己主動呼叫 AlarmManager.cancel ()。原文說的比較抽象,這裡具體說一下:setInexactRepeating指的是設定非準確鬧鐘,用法:alarmManager.setInexactRepeating(AlarmManager.RTC, startTime。intervalL, pendingIntent),非準確鬧鐘僅僅能保證大致的時間間隔,可是不一定準確,可能出現設定間隔為30分鐘,可是實際上一次間隔20分鐘。還有一次間隔40分鐘。它的最大的優點是能夠合併鬧鐘事件。比方間隔設定每30分鐘一次,不喚醒休眠,在休眠8小時後已經積累了16個鬧鐘事件,而在手機被喚醒的時候,非準時鬧鐘能夠把16個事件合併為一個。 所以這麼看來,非準時鬧鐘一般來說比較節約能源。

Formatter.formatFileSize() 一個區域化的檔案大小格式化工具。

通俗來說就是把大小轉換為MB。G。KB之類的字串。

ActionBar.hide()/.show() 顧名思義。隱藏和顯示ActionBar,能夠優雅地在全屏和帶Actionbar之間轉換。

Linkify.addLinks() 在Text上增加連結。非常有用。

StaticLayout 在自己定義 View 中渲染文字的時候非常有用。

Activity.onBackPressed() 非常方便的管理back鍵的方法,有時候須要自己控制返回鍵的事件的時候,能夠重寫一下。比方增加 “點兩下back鍵退出” 功能。

GestureDetector 用來監聽和相應相應的手勢事件。比方點選,長按。慢滑動,快滑動,用起來非常easy,比你自己實現要方便很多。

DrawFilter 能夠讓你在不呼叫onDrew方法的情況下。操作canvas。比了個如,你能夠在建立自己定義 View 的時候設定一個 DrawFilter。給父 View 裡面的全部 View 設定反別名。

ActivityManager.getMemoryClass() 告訴你你的機器還有多少記憶體。在計算快取大小的時候會比較有用.

ViewStub 它是一個初始化不做不論什麼事情的 View。可是之後能夠載入一個佈局檔案。在慢載入 View 中非常適合做佔位符。唯一的缺點就是不支援標籤,所以假設你不太小心的話,可能會在檢視結構中增加不須要的巢狀。

SystemClock.sleep() 這種方法在保證一定時間的 sleep 時非常方便。通常我用來進行 debug 和模擬網路延時。

DisplayMetrics.density 這種方法你能夠獲取裝置畫素密度,大部分時候最好讓系統來自己主動進行縮放資源之類的操作。可是有時候控制的效果會更好一些.(尤其是在自己定義View的時候).

Pair.create() 方便構建類和構造器的方法。

Activity.startActivities() 常常使用於在應用程式中間啟動其它的Activity.

TextUtils.isEmpty() 簡單的工具類,用於檢測是否為空

Html.fromHtml() 用於生成一個Html,引數能夠是一個字串.個人覺得它不是非常快,所以我不怎麼常常去用.(我說不常常常使用它是為了重點突出這句話:請多手動構建 Spannable 來替換 Html.fromHtml),可是它對渲染從 web 上獲取的文字還是非常不錯的。

TextView.setError() 在驗證使用者輸入的時候非常棒

Build.VERSION_CODES 這個標明瞭當前的版本號號,在處理相容性問題的時候常常會用到.點進去能夠看到各個版本號的不同特性

Log.getStackTraceString() 方便的日誌類工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是將列印資訊到LogCat中,有時候須要將出錯的資訊插入到資料庫或一個自己定義的日誌檔案裡,那麼這種情況就須要將出錯的資訊以字串的形式返回來,也就是使用static String getStackTraceString(Throwable tr)方法的時候.

LayoutInflater.from() 顧名思義,用於Inflate一個layout,引數是layout的id.這個常常寫Adapter的人會用的比較多.

ViewConfiguration.getScaledTouchSlop() 使用 ViewConfiguration 中提供的值以保證全部觸控的互動都是統一的。

這種方法獲取的值表示:使用者的手滑動這個距離後,才判定為正在進行滑動.當然這個值也能夠自己來決定.可是為了一致性,還是使用標準的值較好.

PhoneNumberUtils.convertKeypadLettersToDigits 顧名思義.將字母轉換為數字,相似於T9輸入法,

Context.getCacheDir() 獲取快取資料目錄的路徑,非常easy可是知道的人不多,這個路徑通常在SD卡上(這裡的SD卡指的是廣義上的SD卡,包括外部儲存和內部儲存)Adnroid/data/您的應用程式包名/cache/  以下.測試的時候,能夠去這裡面看是否快取成功.快取在這裡的優點是:不用自己再去手動建立目錄,不用操心使用者把自己建立的目錄刪掉,在應用程式解除安裝的時候,這裡會被清空,使用第三方的清理工具的時候,這裡也會被清空.

ArgbEvaluator 用於處理顏色的漸變。就像 Chris Banes 說的一樣,這個類會進行非常多自己主動裝箱的操作。所以不妨去掉它的邏輯自己去實現它。這個沒用過,不明其所以然,回頭再補充.

ContextThemeWrapper 方便在執行的時候改動主題.

Space space是Android 4.0中新增的一個控制元件。它實際上能夠用來分隔不同的控制元件。當中形成一個空白的區域.這是一個輕量級的檢視元件,它能夠跳過Draw,對於須要佔位符的不論什麼場景來說都是非常棒的。

ValueAnimator.reverse() 這種方法能夠非常順利地取消正在執行的動畫.我超喜歡.



相關文章