中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Android 開發(fā)中不可不知的小技巧

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

這里收集了大家常用的一些Android代碼,持續(xù)更新中,內(nèi)容來自自己的平時(shí)積累和網(wǎng)絡(luò)上看到的文章,部分原文地址在最下方。如有錯(cuò)誤歡迎指正,如有侵權(quán),請聯(lián)系我刪除。里面可能會(huì)有重復(fù)內(nèi)容,請忽略或者提醒我刪除。

  • setBackgroundResource(0) 可以移除 View 的背景色

  • Resources.getSystem().getDisplayMetrics().density 可以不用 Context 也能獲取屏幕密度哦

  • 通過重載 ViewGroup 的 dispatchDraw 可以實(shí)現(xiàn)一個(gè)簡單的蒙版效果。 例如下拉刷新時(shí),可以在 contentView 上加一層遮罩。 canvas.drawRect(0, mContentView.getTranslationY(), getWidth(), getHeight(), mMaskPaint);

  • new 出來的 View 可以用 View.generateViewId() (API 17 以上可用) 生成 id,系統(tǒng)保證唯一

  • 使用 GridView時(shí) android:padding 和 android:clipToPadding="false" 配合使用效果更好哦。

  • 在布局文件中,如果只是為了占位,可以用 Space 來取代 View。 最棒的一點(diǎn)是Space可以跳過 Draw 這個(gè)過程。

  • TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics) 方便dp, px, sp 之間的轉(zhuǎn)換。

  • Activity.startActivities() 這個(gè)方法最直接的理解就是使用intent開啟多個(gè)Activity

  • TextUtils.isEmpty() 如果傳入的String 為NULL或者Length為0的話就返回 true。

  • Html.fromHtml() 如果你對Html熟悉的話,可以很迅速通過這個(gè)方法處理一些富文本操作。比如超鏈接和圖文排版等處理。

  • TextView.setError() 設(shè)置文本框錯(cuò)誤提醒

  • Build.VERSION_CODES 有些時(shí)候我們的app需要根據(jù)不同的SDK版本進(jìn)行執(zhí)行不同的操作

  • PhoneNumberUtils.convertKeypadLettersToDigits 這個(gè)方法簡單粗暴,會(huì)將輸入的字母根據(jù)鍵盤上的映射轉(zhuǎn)換為數(shù)字。

  • ArgbEvaluator ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);根據(jù)一個(gè)起始顏色值和一個(gè)結(jié)束顏色值以及一個(gè)偏移量生成一個(gè)新的顏色,分分鐘實(shí)現(xiàn)類似于微信底部欄滑動(dòng)顏色漸變。

  • ValueAnimator.reverse() 順暢的取消動(dòng)畫效果

  • DateUtils.formatDateTime()) 這個(gè)方法可以輸出相應(yīng)格式化的時(shí)間或者日期

  • Pair 這個(gè)類 可以用來存儲(chǔ)存儲(chǔ)一”組”數(shù)據(jù)。但不是key和value的關(guān)系。

  • SparseArray 目前有很多地方從性能優(yōu)化方說使用SparseArray來替換hashMap,來節(jié)省內(nèi)存,提高性能。

  • Linkify.addLinks() 這個(gè)類可以更方便的為文本添加超鏈接。

  • android.media.ThumbnailUtils這個(gè)類主要是用來處理縮略圖相關(guān)的工作,比如:用來獲取媒體(圖片、視頻)的縮略圖;

  • Bitmap.extractAlpha ();返回一個(gè)新的Bitmap,capture原始圖片的alpha值。有的時(shí)候我們需要?jiǎng)討B(tài)的修改一個(gè)元素的背景圖片又不希望使用多張圖片的時(shí)候,通過這個(gè)方法,結(jié)合Canvas和Paint可以動(dòng)態(tài)的修改一個(gè)純色Bitmap的顏色。

  • 模塊間有消息需要傳遞時(shí),使用LocalBroadcastManager替代Listener進(jìn)行模塊解耦。除了解耦,這樣發(fā)送消息和執(zhí)行消息差一個(gè)線程循環(huán),可以減小方法的調(diào)用鏈,我這就碰到一次方法調(diào)用鏈太長導(dǎo)致StackOverflow的問題。

  • 靜態(tài)變量不要直接或者間接引用Activity、Service等。這會(huì)使用Activity以及它所引用的所有對象無法釋放,然后,用戶操作時(shí)間一長,內(nèi)存就會(huì)狂升。

  • Handler機(jī)制有一個(gè)特點(diǎn)是不會(huì)隨著Activity、Service的生命周期結(jié)束而結(jié)束。也就是說,如果你Post了一個(gè)Delay的Runnable,然后在Runnable執(zhí)行之前退出了Activity,Runnable到時(shí)間之后還是要執(zhí)行的。如果Runnable里面包含更新View的操作,程序崩潰了。

  • 不少人在子線程中更新View時(shí)喜歡使用Context.runOnUiThread,這個(gè)方法有個(gè)缺點(diǎn),就是一但Context生命周期結(jié)束,比如Activity已經(jīng)銷毀時(shí),一調(diào)用就會(huì)崩潰。

  • SharedPreferences.Editor.commit這個(gè)方法是同步的,一直到把數(shù)據(jù)同步到Flash上面之后才會(huì)返回,由IO操作的不可控,盡量使用apply方法代替。apply只在API Level>=9才會(huì)支持,需要做兼容。不過,最新的 support v4 包已經(jīng)為我們做好了處理,使用 SharedPreferencesCompat.EditorCompat.getInstance().apply(editor) 即可。

  • PackageManager.getInstalledPackages這個(gè)方法經(jīng)常使用,你可能不知道,當(dāng)獲取的結(jié)果數(shù)量比較多的時(shí)候,在某些機(jī)型上面調(diào)用它花費(fèi)的時(shí)間可能秒級的,所以盡量在子線程中使用。另外,如果結(jié)果太多,超過系統(tǒng)設(shè)置的Binder數(shù)據(jù)最大傳輸量的上限,則會(huì)發(fā)生TransactionException,如果你使用這個(gè)方法獲取機(jī)器上的己安裝應(yīng)用列表,最好做一下預(yù)防。

  • 如果使用Context.startActivity啟動(dòng)外部應(yīng)用,最好做一下異常預(yù)防,因?yàn)閷ふ也坏綄?yīng)的應(yīng)用時(shí),會(huì)拋出異常。如果你要打開的是應(yīng)用內(nèi)的Activity,不防使用顯式Intent,這樣能提高系統(tǒng)搜索目標(biāo)Activity的效率。

  • Application的生命周期就是進(jìn)程的生命周期。只有進(jìn)程被干掉時(shí),Application才會(huì)銷毀。哪怕是沒有Activity、Service在運(yùn)行,Application也會(huì)存在。所以,為了減少內(nèi)存壓力,盡量不要在Application里面引用大對象、Context等。

  • getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);設(shè)置全屏方法一定要在setContentView之后

  • viewpager 的 setCurrentItem 一定要在 setAdapter 方法之后調(diào)用才會(huì)有效果.

  • 判斷手機(jī)是不是飛行模式 boolean isEnabled = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;

  • TabLayout 修改字體的方法 官方的 TabLayout 沒有提供修改 TextView size 的方法,可以新建一個(gè) style CustomTabLayoutTextAppearance 繼承 TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse ,然后增加 item ,設(shè)置 android:textAllCaps 為 true ,再設(shè)置 android:textSize 為你想設(shè)置的大小。 再在 TabLayout 的布局文件里設(shè)置 app:tabTextAppearance="@style/CustomTabLayoutTextAppearance" 即可。 

  • 遍歷HashMap的最佳方法

public static void printMap(Map mp) { Iterator it = mp.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry)it.next(); System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException }
}
  • 使用Java在一個(gè)區(qū)間內(nèi)產(chǎn)生隨機(jī)整數(shù)數(shù)
public static int randInt(int min, int max) { Random rand = new Random(); int randomNum = rand.nextInt((max - min) + 1) + min; return randomNum;
}
  • 如果子類實(shí)現(xiàn)Serializable接口而父類未實(shí)現(xiàn)時(shí),父類不會(huì)被序列化,但此時(shí)父類必須有個(gè)無參構(gòu)造方法,否則會(huì)拋InvalidClassException異常。

  • transient關(guān)鍵字修飾變量可以限制序列化。

  • 當(dāng)使用JakeWharton的TabPageIndicator時(shí),如果需要先做一些耗時(shí)的操作,然后再展示TabPageIndicator的話,需要先設(shè)置mIndirector.setVisibility(View.GONE);然后耗時(shí)任務(wù)結(jié)束以后再mIndirector.setVisibility(View.VISIBLE);否則會(huì)報(bào)錯(cuò)

  • 類繼承之間的調(diào)用順序 父類static成員 -> 子類static成員 -> 父類普通成員初始化和初始化塊 -> 父類構(gòu)造方法 -> 子類普通成員初始化和初始化塊 -> 子類構(gòu)造方法

  • 華為手機(jī)無法顯示log解決方案,.撥號(hào)界面輸入(*#*#2846579#*#*) Service menu will appear.Go to "ProjectMenu" -> "Background Setting" -> "Log Setting"Open "Log switch" and set it to ON.Open "Log level setting" and set the log level you wish.

  • 后臺(tái)service經(jīng)常因?yàn)橹貑⒅惖某霈F(xiàn)onStartCommand()中的Intent傳遞的參數(shù)為null, 通過在onStartCommand()中的返回值改成return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId); 可以解決問題。下面介紹幾個(gè)flag的意思

  • flag 解釋
    START_STICKY 如果service進(jìn)程被kill掉,保留service的狀態(tài)為開始狀態(tài),但不保留遞送的intent對象。隨后系統(tǒng)會(huì)嘗試重新創(chuàng)建service,由于服務(wù)狀態(tài)為開始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動(dòng)命令被傳遞到service,那么參數(shù)Intent將為null。
    START_NOT_STICKY “非粘性的”。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù)。
    START_REDELIVER_INTENT 重傳Intent。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將Intent的值傳入。
    START_STICKY_COMPATIBILITY START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟。
  • 不能在Activity沒有完全顯示時(shí)顯示PopupWindow和Dialog

  • 在多進(jìn)程之間不要用SharedPreferences共享數(shù)據(jù),雖然可以(MODE_MULTI_PROCESS),但極不穩(wěn)定

  • 有些時(shí)候不能使用Application的Context,不然會(huì)報(bào)錯(cuò)(比如啟動(dòng)Activity,顯示Dialog等) 

*備注:大家注意看到有一些NO上添加了一些數(shù)字,其實(shí)這些從能力上來說是YES,但是為什么說是NO呢?下面一個(gè)一個(gè)解釋: 1. 數(shù)字1:啟動(dòng)Activity在這些類中是可以的,但是需要?jiǎng)?chuàng)建一個(gè)新的task,一般情況不推薦; 2. 數(shù)字2:在這些類中去layout inflate是合法的,但是會(huì)使用系統(tǒng)默認(rèn)的主題樣式,如果你自定義了某些樣式可能不會(huì)被使用; 3. 數(shù)字3:在Receiver為null時(shí)允許,在4.2或以上的版本中,用于獲取黏性廣播的當(dāng)前值。(可以無視); 4. ContentProvider、BroadcastReceiver之所以在上述表格中,是因?yàn)樵谄鋬?nèi)部方法中都有一個(gè)context用于使用。

  • 謹(jǐn)慎使用Android的透明主題,透明主題會(huì)導(dǎo)致很多問題,比如:如果新的Activity采用了透明主題,那么當(dāng)前Activity的onStop方法不會(huì)被調(diào)用;在設(shè)置為透明主題的Activity界面按Home鍵時(shí),可能會(huì)導(dǎo)致刷屏不干凈的問題;進(jìn)入主題為透明主題的界面會(huì)有明顯的延時(shí)感
  • 不要在非UI線程中初始化ViewStub,否則會(huì)返回null

  • 盡量不要通過Application緩存數(shù)據(jù),這不穩(wěn)定

  • 華為手機(jī)無法打開USB調(diào)試的問題,

  • 插好數(shù)據(jù)線,撥號(hào)界面 輸入 ##2846579## 進(jìn)入工程模式
  • projectmenu→3后臺(tái)設(shè)置→4USB端口配置→Balong調(diào)試模式,點(diǎn)確定
  • 不要拔線,退出工程模式,直接重啟手機(jī),電腦中顯示可移動(dòng)磁盤(若仍未出現(xiàn),重復(fù)步驟1、2)
  • 這個(gè)是關(guān)閉USB調(diào)試的情況下電腦中使用手機(jī)的可移動(dòng)磁盤的方法,使用后下拉菜單中usb選項(xiàng)也回來了。

  • android listview中的消息被軟鍵盤遮擋了,在設(shè)置listview的時(shí)候加上android:transcriptMode="normal"就好了

  • TextUtils 是一個(gè)非常好用的工具類,把 List 轉(zhuǎn)成字符串,逗號(hào)分隔,逗號(hào)分隔的 String 字符串,切割成 List ,分別可以用 TextUtils 的 join 和 split 方法。如果要對 List 去重,則可以用 Collection 的 frequency 方法。

  • 在activity中調(diào)用 moveTaskToBack (boolean nonRoot)方法即可將activity 退到后臺(tái),注意不是finish()退出。

  • activity中的runOnUiThrea(Runnable action)方法可以直接回到主線程

  • listview有個(gè)footerDividersEnabled和headerDividersEnabled方法可以設(shè)置listview的頂部和底部divide,但是必須保證你設(shè)置了headview和footview才會(huì)有效果

  • Throwable類中的getStackTrace()方法,根據(jù)這個(gè)方法可以得到函數(shù)的逐層調(diào)用地址,其返回值為StackTraceElement[];

  • StackTraceElement類,其中四個(gè)方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調(diào)試程序打印Log時(shí)非常有用;

  • UncaughtExceptionHandler接口,再好的代碼異常難免,利用此接口可以對未捕獲的異常善后

  • Resources類中的getIdentifier(name, defType, defPackage)方法,根據(jù)資源名稱獲取其ID,做UI時(shí)經(jīng)常用到;

  • view的isShown方法,只有當(dāng)view本身以及它的所有祖先們都是visible時(shí),isShown()才返回TRUE。而平常我們調(diào)用if(view.getVisibility() == View.VISIBLE)只是對view本身而不對祖先的可見性進(jìn)行判斷。

  • Arrays類中的一系列關(guān)于數(shù)組操作的工具方法:binarySearch(),asList(),equals(),sort(),toString(),copyOfRange()等;Collections類中的一系列關(guān)于集合操作的工具方法:sort(),reverse()等;

  • TextView類中的append(CharSequence)方法,添加文本。一些特殊文本直接用+連接會(huì)變成String;

  • System類中的arraycopy(src, srcPos, dest, destPos, length)方法,用來copy數(shù)組;

  • Fragment類中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時(shí)貌似Fragment的其它生命周期方法都不會(huì)被調(diào)用,太坑爹!

  • Activity類中的onWindowFocusChanged(boolean),onNewIntent(intent)等回調(diào)方法;

  • TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實(shí)現(xiàn)“顯示密碼”功能

  • PageTransformer接口,用來自定義ViewPager頁面切換動(dòng)畫,用setPageTransformer(boolean, PageTransformer)方法來進(jìn)行設(shè)置;

  • apache提供的一系列jar包:commons-lang.jar,commons-collections.jar,commons-beanutils.jar等,里面很多方法可能是你曾經(jīng)用幾十幾百行代碼實(shí)現(xiàn)過的,但是執(zhí)行效率或許要差很多,比如:ArrayUtils,StringUtils……;

  • ActivityLifecycleCallbacks接口,用于在Application類中監(jiān)聽各Activity的狀態(tài)變化 ![閱讀地址]{http://mp.weixin.qq.com/s?__biz=MzA3ODkzNzM3NQ==&mid=401277907&idx=1&sn=0b2246f5178292596fc3a8295283359c#rd}

  • ActionBar.hide()/.show() 顧名思義,隱藏和顯示ActionBar,可以優(yōu)雅地在全屏和帶Actionbar之間轉(zhuǎn)換。

  • SystemClock.sleep() 這個(gè)方法在保證一定時(shí)間的 sleep 時(shí)很方便,通常我用來進(jìn)行 debug 和模擬網(wǎng)絡(luò)延時(shí)。

  • UrlQuerySanitizer——使用這個(gè)工具可以方便對 URL 進(jìn)行檢查。

  • ActivityOptions ——方便的定義兩個(gè)Activity切換的動(dòng)畫。 使用ActivityOptionsCompat 可以很好解決舊版本的兼容問題。

  • getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán),誰用誰知道。

  • HandlerThread,代替不停new Thread開子線程的重復(fù)體力寫法。

  • IntentService,一個(gè)可以干完活后自己去死且不需要我們?nèi)ス芾碜泳程的Service

  • Executors. newSingleThreadExecutor();這個(gè)是java的,之前不知道它,自己花很大功夫去研究了單線程順序執(zhí)行的任務(wù)隊(duì)列

  • android:animateLayoutChanges="true",LinearLayout中添加View的動(dòng)畫的辦法,支持通過setLayoutTransition()自定義動(dòng)畫。

  • AsyncQueryHandler,如果做系統(tǒng)工具類的開發(fā),比如聯(lián)系人短信輔助工具等,肯定免不了和ContentProvider打交道,如果數(shù)據(jù)量不是很大的情況下,隨便搞,如果數(shù)據(jù)量大的情況下,了解下這個(gè)類是很有必要的,需要注意的是,這玩意兒吃異常..

  • ViewFlipper,實(shí)現(xiàn)多個(gè)view的切換(循環(huán)),可自定義動(dòng)畫效果,且可針對單個(gè)切換指定動(dòng)畫。

  • android util包中的Pair類,可以方便的用來存儲(chǔ)一"組"數(shù)據(jù)。注意不是key value

  • android:descendantFocusability,ListView的item中CheckBox等元素?fù)尳裹c(diǎn)導(dǎo)致item點(diǎn)擊事件無法響應(yīng)時(shí),除了給對應(yīng)的元素設(shè)置 focusable,更簡單的是在item根布局加上android:descendantFocusability=”blocksDescendants”

  • includeFontPadding="false",TextView默認(rèn)上下是有一定的padding的,有時(shí)候我們可能不需要上下這部分留白,加上它即可。

  • Messenger,面試的時(shí)候通常都會(huì)被問到進(jìn)程間通信,一般情況下大家都是開始背書,AIDL巴拉巴拉。。有一天在鴻神的博客看到這個(gè),嗯,如他所說,又可以裝一下了。

  • EditTxt.setImeOptions, 使用EditText彈出軟鍵盤時(shí),修改回車鍵的顯示內(nèi)容(一直很討厭用回車鍵來交互,所以之前一直不知道這玩意兒)

  • java8中新增的LocalDate和LocalTime接口,Date雖然是個(gè)萬能接口,但是它真的不好用,有了這倆,終于可以愉快的處理日期時(shí)間了。

  • WeakHashMap,直接使用HashMap有時(shí)候會(huì)帶來內(nèi)存溢出的風(fēng)險(xiǎn),使用WaekHashMap實(shí)例化Map。當(dāng)使用者不再有對象引用的時(shí)候,WeakHashMap將自動(dòng)被移除對應(yīng)Key值的對象。

  • 使用SnackBar的時(shí)候,不要使用view.getRootView()作為snackbar的view,華為榮耀7 會(huì)出問題。

  • 設(shè)置TextView單行顯示的時(shí)候不要用Lines=1,而要用singleLine="true" ,因?yàn)轺茸宀糠质謾C(jī)在設(shè)置Lines=1的時(shí)候,然后TextView的值全為數(shù)字的時(shí)候, 你就會(huì)懵逼了.

  • TouchDelegate可用于更改View的觸摸區(qū)域。場景:比如在RecyclerView的ItemView里包含了CheckBox組件, 然后想實(shí)現(xiàn)點(diǎn)擊ItemView的時(shí)候,也可以觸發(fā)CheckBox,就可以使用此類

  • ArgbEvaluator可用于計(jì)算不同顏色值之間的插值,配合ValueAnimator.ofObject或者ViewPager.PageTransformer使用,可以實(shí)現(xiàn)不同顏色之間的平滑過渡。

  • Palette可用于提取一張圖片的顏色。

  • ViewDragHelper,做過自定義ViewGroup的童鞋都應(yīng)該知道這個(gè)東西吧,用來處理觸摸事件的神器,媽媽再也不用擔(dān)心我自定義控件了。

  • PageTransformer用于定義ViewPager頁面切換時(shí)的動(dòng)畫效果(淡入淡出,放大縮小神馬的…)官方有例子,直接看吧。

  • Formatter.formatFileSize() 這個(gè)方法會(huì)格式化數(shù)據(jù)的大小,根據(jù)輸入的字節(jié)大小,返回 B KB MB GB 等等(最大支持到 PB)。當(dāng)然要注意的是輸入的最大值是 Long.MAX_VALUE.

  • Activity.recreate重新創(chuàng)建Activity。有什么用呢?可以在程序更換主題后,立馬刷新當(dāng)前Activity,而不會(huì)有明顯的重啟Activity的動(dòng)畫。

  • View.getContext顧名思義,就不用解釋了吧…以前在寫RecyclerView的Adapter的時(shí)候,為了使用LayoutInflater,經(jīng)常傻乎乎地在構(gòu)造函數(shù)中傳入一個(gè)外部的context….是不是只有我不知道而已(笑cry臉)

  • View.post方便在非UI線程對界面進(jìn)行修改,與Handler的作用類似。并且由于post的Runnable會(huì)保證在該View繪制完成的前提下才調(diào)用,所以一般也可以用于獲取View的寬高。

  • Activity.runOnUiThread與View.post類似,方便在非UI線程中對界面進(jìn)行修改。

  • Fragment在配合PagerAdapter使用的時(shí)候可以重寫setUserVisibleHintFragment()方法,然后根據(jù)參數(shù)的布爾值(true的話表示當(dāng)前Fragment對用戶可見),來執(zhí)行一些邏輯。

  • android:animateLayoutChanges 這是一個(gè)非?犰诺膶傩。在父布局加上 android:animateLayoutChanges="true" 后,如果觸發(fā)了layout方法(比如它的子View設(shè)置為GONE),系統(tǒng)就會(huì)自動(dòng)幫你加上布局改變時(shí)的動(dòng)畫特效!!

  • android:clipToPadding 設(shè)置父view是否允許其子view在它的padding(這里指的是父View的padding)中繪制。是不是有點(diǎn)繞?舉個(gè)實(shí)際場景吧:假如有個(gè)ListView,我們想要在初始位置時(shí),第一項(xiàng)Item離頂部有10dp的距離,就可以在ListView的布局中加入android:clipToPadding="false" android:paddingTop="10dp"即可。是不是很方便呢?

  • rv 的 Layoutmanager 可以直接申明在 xml 中,具體代碼可查看RecyclerView.createLayoutManager 方法. 

  • RecyclerView在23.2.+的版本中新增了自動(dòng)測量的功能,由于新增了自動(dòng)測量,那么它的item的根布局在需要測量的方向上就不能寫match_parent了,需要改成wrap_content

  • getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán),誰用誰知道。

  • Canvas中clipRect、clipPath和clipRegion剪切區(qū)域的API。

  • GradientDrawable 有個(gè)陰影效果還不錯(cuò),以為是切的圖片,一看代碼,什么鬼= =!

  • 有朋友提到了在自定義View時(shí)有些方法在開啟硬件加速的時(shí)候沒有效果的問題,在API16之后確實(shí)有很多方法不支持硬件加速,通常我們關(guān)閉硬件加速都是在清單文件中通過,其實(shí)android也提供了針對特定View關(guān)閉硬件加速的方法,調(diào)用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可。

  • PointF,graphics包中的一個(gè)類,我們經(jīng)常見到在處理Touch事件的時(shí)候分別定義一個(gè)downX,一個(gè)downY用來存儲(chǔ)一個(gè)坐標(biāo),如果坐標(biāo)少還好,如果要記錄的坐標(biāo)過多那代碼就不好看了。用PointF(float x, float y);來描述一個(gè)坐標(biāo)點(diǎn)會(huì)清楚很多。

  • StateListDrawable,定義Selector通常的辦法都是xml文件,但是有的時(shí)候我們的圖片資源可能是從服務(wù)器動(dòng)態(tài)獲取的,比如很多app所謂的皮膚,這種時(shí)候就只能通StateListDrawable來完成了,各種addState即可。

  • android:duplicateParentState="true",讓子View跟隨其Parent的狀態(tài),如pressed等。常見的使用場景是某些時(shí)候一個(gè)按鈕很小,我們想要擴(kuò)大其點(diǎn)擊區(qū)域的時(shí)候通常會(huì)再給其包裹一層布局,將點(diǎn)擊事件寫到Parent上,這時(shí)候如果希望被包裹按鈕的點(diǎn)擊效果對應(yīng)的Selector繼續(xù)生效的話,這時(shí)候duplicateParentState就派上用場了。

  • ViewConfiguration.getScaledTouchSlop();觸發(fā)移動(dòng)事件的最小距離,自定義View處理touch事件的時(shí)候,有的時(shí)候需要判斷用戶是否真的存在movie,系統(tǒng)提供了這樣的方法。

  • ViewStub,有的時(shí)候一塊區(qū)域需要根據(jù)情況顯示不同的布局,通常我們都會(huì)通過setVisibility的方法來顯示和隱藏不同的布局,但是這樣默認(rèn)是全部加載的,用ViewStub可以更好的提升性能。

  • onTrimMemory,在Activity中重寫此方法,會(huì)在內(nèi)存緊張的時(shí)候回調(diào)(支持多個(gè)級別),便于我們主動(dòng)的進(jìn)行資源釋放,避免OOM。

  • TextView.setCompoundDrawablePadding,代碼設(shè)置TextView的drawable padding。

  • ImageSwitcher,可以用來做圖片切換的一個(gè)類,類似于幻燈片。

  • 在自定義控件的時(shí)候,能用drawable來繪制圓,或者其他樣式的時(shí)候,盡量用drawable,因?yàn)閐rawable的效果要遠(yuǎn)勝于canvas.drawXXX().

  • 如果想要自定義View支持SwipeRefreshLayout,只需要聲明并實(shí)現(xiàn)ScrollingView接口即可,RecyclerView和NestedScrollView已經(jīng)實(shí)現(xiàn)此接口。

  • AtomicFile——通過使用備份文件進(jìn)行文件的原子化操作。這個(gè)知識(shí)點(diǎn)之前我也寫過,不過最好還是有出一個(gè)官方的版本比較好。

  • DatabaseUtils——一個(gè)包含各種數(shù)據(jù)庫操作的使用工具。

  • Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 會(huì)經(jīng)常改變的話,使用這個(gè)方法就可以不用手動(dòng)做保存狀態(tài)的工作了。

  • SearchRecentSuggestionsProvider——可以創(chuàng)建最近提示效果的 provider,是一個(gè)簡單快速的方法。

  • android:clipChildren (ViewGroup)——如果此屬性設(shè)置為不可用,那么 ViewGroup 的子 View 在繪制的時(shí)候會(huì)超出它的范圍,在做動(dòng)畫的時(shí)候需要用到。

  • android:fillViewport (ScrollView)——在這片文章中有詳細(xì)介紹文章鏈接,可以解決在 ScrollView 中當(dāng)內(nèi)容不足的時(shí)候填不滿屏幕的問題。

  • android:tileMode (BitmapDrawable)——可以指定圖片使用重復(fù)填充的模式。

  • android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具有多種狀態(tài)的時(shí)候,可以定義它展示前的淡入淡出效果。

  • Log.wtf()的意思是What a Terrible Failure,而不是What The Fuck!

  • 使用RenderScript虛化圖片效果。如果你的app的minSDK為16或者更低,你需要使用support模式,因?yàn)楹芏喾椒ǘ际窃贏PI 17之后添加的。renderscriptTargetApi最高到23,但是你應(yīng)該把它設(shè)置到能保持腳本中使用到的功能完整的最低API。如果你想在support模式下target API 21+你必須使用gradle-plugin 2.1.0 和 buildToolsVersion “23.0.3” 或者以上。需要在gradle中添加renderscriptTargetApi 18,renderscriptSupportModeEnabled true 這兩句話

public static Bitmap blurBitmap(Context context, Bitmap src, int radius) { Bitmap dest = src.copy(src.getConfig(), true); RenderScript rs = RenderScript.create(context); Allocation allocation = Allocation.createFromBitmap(rs, src); Type t = allocation.getType(); Allocation blurredAllocation = Allocation.createTyped(rs, t); ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        blurScript.setRadius(radius);
        blurScript.setInput(allocation);
        blurScript.forEach(blurredAllocation);
        blurredAllocation.copyTo(dest);
        allocation.destroy();
        blurredAllocation.destroy();
        blurScript.destroy();
        t.destroy();
        rs.destroy(); return dest;
    }
  • 如果想把一個(gè)view保存為Bitmap,正常情況下用第一種方法就可以了,但是如果是ScrollView,則必須采用第二種方法。 
     

  • 當(dāng)Activity LauncherMode 為singleTask singleInstance時(shí),使用startActivityForResult會(huì)立馬返回,不能正常調(diào)用。具體請看http://www.360doc.com/content/15/0123/14/12928831_443085580.shtml

  • 當(dāng)PopupWindow中有EditText控件時(shí),因?yàn)镻opupwindow 默認(rèn)沒有獲取到焦點(diǎn),需要手動(dòng)設(shè)置焦點(diǎn),這樣子view才能獲取到事件的監(jiān)聽。所以你需要在創(chuàng)建完popwindow后設(shè)置他的焦點(diǎn),popupWindow.setFocusable(true);就可以讓EditText獲取焦點(diǎn)。

  • PopupWindow默認(rèn)點(diǎn)擊外部的時(shí)候不消失,需要對PopupWindow 設(shè)置一個(gè)背景圖popWindow.setBackgroundDrawable(new BitmapDrawable());要?jiǎng)?chuàng)建一個(gè)空對象,設(shè)置為null是不行的,或者就創(chuàng)建一個(gè)全透明的背景圖。

  • android中的序列化官方推薦Parceble,其實(shí)Parceble最好用于內(nèi)存之間數(shù)據(jù)的交換,如果要把數(shù)據(jù)寫入硬盤的話,推薦實(shí)現(xiàn)Serializable

  • tools標(biāo)簽可以很好的幫助開發(fā)者實(shí)時(shí)預(yù)覽xml的效果,并且運(yùn)行以后tools標(biāo)簽的內(nèi)容不會(huì)展示出來.例如:

<TextView android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="這段話只在預(yù)覽時(shí)能看到,運(yùn)行以后就看不到了" />
  • android studio 2.1起已經(jīng)支持jdk8了,使用的時(shí)候要在gradle中加上,需要把buildToolsVersion更新到24以上的版本
android {
    defaultConfig {
    ...
            jackOptions {
                enabled true
            }
        }
   ...
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}
  • 6.0之后getResources().getColor()方法被廢棄了,大家可以用ContextCompat.getColor(context, R.color.color_name)替換,ContextCompat 是 v4 包里的,請放心使用,另外還有g(shù)etDrawable()等方法

  • 圖片的資源文件官方推薦只把launcher放在mipmap文件夾下面,而app用到的資源文件建議放在drawable下面。

  • SharedPreference.Editor的apply是異步操作,不會(huì)返回成功的狀態(tài),而commit是同步操作,因此,在多個(gè)并發(fā)的提交commit的時(shí)候,他們會(huì)等待正在處理的commit保存到磁盤后再操作下一個(gè)數(shù)據(jù),從而降低了效率。

  • 如果你在 manifest 中把一個(gè) activity 設(shè)置成 android:windowSoftInputMode="adjustResize",那么 ScrollView(或者其它可伸縮的 ViewGroups)會(huì)縮小,從而為軟鍵盤騰出空間。但是,如果你在 activity 的主題中設(shè)置了 android:windowFullscreen="true",那么 ScrollView 不會(huì)縮小。這是因?yàn)樵搶傩詮?qiáng)制 ScrollView 全屏顯示。然而在主題中設(shè)置 android:fitsSystemWindows="false" 也會(huì)導(dǎo)致 adjustResize 不起作用

  • 在Android 4.0以后,在Manifest.xml中靜態(tài)注冊的廣播,程序安裝后必須啟動(dòng)一次才能接收到廣播,比如你的應(yīng)用監(jiān)聽開機(jī)啟動(dòng)的廣播,必須要你的程序被運(yùn)行過才能監(jiān)聽到

  • Activity的onDestory方法調(diào)用時(shí)機(jī)是不確定的(有時(shí)候離開界面很久之后才會(huì)調(diào)用onDestory方法),應(yīng)該避免指望通過onDestory方法去釋放與Activity相關(guān)的資源,否則會(huì)導(dǎo)致一些隨機(jī)bug

  • 2.X時(shí)代Bitmap對象雖然存儲(chǔ)在堆內(nèi)存中,但是用了一個(gè)byte數(shù)組存儲(chǔ)其像素信息。通過計(jì)數(shù)器來記錄該像素信息被引用的個(gè)數(shù)。有人認(rèn)為這個(gè)byte數(shù)組在native堆中,但事實(shí)上它也在堆中。只有在使用者調(diào)用recycle()后,Bitmap對象才會(huì)釋放像素信息,才會(huì)在失去引用后被垃圾回收機(jī)制銷毀。再加上DVM的heap size有嚴(yán)格的閥值,所以在使用大量圖片資源的時(shí)候,及其容易發(fā)生OOM。解決辦法一般都是,用一個(gè)哈希表存儲(chǔ)Bitmap對象的軟引用,作為內(nèi)存緩存,并在適當(dāng)時(shí)機(jī)掉用其recycle()。3.0以上版本Bitmap對象可以通過垃圾回收機(jī)制完全銷毀,理論上不用再調(diào)用recycle()。

  • .gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經(jīng)被納入了版本管理中,則修改.gitignore是無效的。那么解決方法就是先把本地緩存刪除(改變成未track狀態(tài)),然后再提交:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'
  • 時(shí)間戳請使用long或者String類型接收,遇到的坑,由于項(xiàng)目中的model好多都是通過GsonFormat生成的,服務(wù)器給的json中的時(shí)間戳都是10位的,導(dǎo)致了GsonFormat自動(dòng)解析成了int, 當(dāng)測試人員選擇時(shí)間為2100年的時(shí)候時(shí)間戳是4開頭的十位 用int類型接收越界了,導(dǎo)致報(bào)錯(cuò)

  • 為你的app添加默認(rèn)布局樣式,比如:每一個(gè)控件都需要寫width和height屬性,然而很多的控件的寬高屬性都是wrap_content,那么我們可以通過在style文件添加如下樣式:

<style name="Theme.YourApp" parent="android:style/Theme.Light">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

這樣,控件的寬高默認(rèn)都是wrap_content樣式啦。

  • 在style中寫的樣式通過視同parent標(biāo)簽來擴(kuò)展你的樣式,這樣更高效。
<style name="Fill">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">fill_parent</item>
</style>
<style name="Fill.Height" parent="@style/Fill">
    <item name="android:orientation">vertical</item>
</style>
  • Android上的應(yīng)用切換按鈕列出的其實(shí)不是應(yīng)用而是Task,所以你會(huì)看到有的應(yīng)用在切換視圖里有多個(gè)任務(wù)。如果你的應(yīng)用中有邏輯上相互獨(dú)立的部分,或者想在多窗口環(huán)境下并排顯示應(yīng)用的兩個(gè)不同部分,這種情況就適合多任務(wù)了。使用manifest屬性(靜態(tài))或者 intent flags(動(dòng)態(tài))可以實(shí)現(xiàn)這一點(diǎn),詳見視頻:http://v.youku.com/v_show/id_XMTU2ODk4NDg2NA==.html?f=26587294

  • 當(dāng)app的theme用的是NoActionBar,但是在layout中仍然用到toolbar的時(shí)候,不要在style文件中加fitsSystemWindows屬性,而是在用到toolbar的layout最外層加fitsSystemWindows,否則當(dāng)你使用EditText,在小米手機(jī)上長按EditText調(diào)出系統(tǒng)粘貼功能的時(shí)候,粘貼的layout的布局會(huì)錯(cuò)位.

  • 當(dāng)WebView與ScrollView嵌套使用,并且WebView有字體放大縮小的功能時(shí),當(dāng)切換webview的字體后,webview的高度并不能很好的計(jì)算出來,這時(shí)候可以通過注入的方式,讓js算出高度,經(jīng)測試,這樣是最可靠的,代碼地址:http://blog.csdn.net/jys1115/article/details/43525979

  • Context類中的createPackageContext(packageName, flags)方法,可用來獲取指定包名應(yīng)用程序的Context對象。

  • TextView類的setKeyListener(KeyListener)方法; 其中DigitsKeyListener類,使用getInstance(String accepted)方法即可指定EditText可輸入字符集;

  • View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置;

摘自如下地址(部分):

  • http://oakzmm.com/2015/08/04/cool-Android-api/
  • http://oakzmm.com/2015/08/11/cool-Android-api-2/
  • http://weibo.com/liangfeizc?from=feed&loc=nickname
  • http://zhuanlan.zhihu.com/zmywly8866/20309921
  • http://www.zhihu.com/question/33636939
  • http://gold.xitu.io/entry/56c2b9b779bc4400540894ac
  • https://www.zhihu.com/question/33636939/answer/57239990?group_id=612750833369153536
  • http://mp.weixin.qq.com/s?__biz=MzA4MTM2MjE2MA==&mid=2650836293&idx=3&sn=2624066ababb6b613634015f54ea19b6&scene=0#wechat_redirect
  • http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0504/4205.html
  • https://zhuanlan.zhihu.com/p/20309921
  • http://www.pfeng.org/archives/840#123-tsina-1-92600-1bb80a0982f5c2ea1fcaf67d7fdce2f1

License

Copyright 2016 NewTab

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

標(biāo)簽: idc isp 代碼 服務(wù)器 腳本 開發(fā)者 媒體 數(shù)據(jù)庫 搜索 通信 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Win7和Linux下的java開發(fā)環(huán)境配置

下一篇:17個(gè)提升iOS開發(fā)效率的必用工具