android開發實用小技巧
字串相關
-
格式化字串,可以使用String類的
format(String,Object…)
方法,如果要格式化資原始檔strings.xml中的字串,可以使用getResources().getString(int,Object…)
方法
String.format("money:¥%.2f",1.00); <resources> <string name="format">money:$%.2f</string> </resources> getResources().getString(R.string.format,1.00);
-
當字串裡有%時,引數formatted為false
<string name="citypartner_sz" formatted="false">%100</string>
-
對於11位手機號,自動新增空格需求,只要新增以下監聽器就可以了
mMobileEt.addTextChangedListener(new PhoneNumberFormattingTextWatcher(Locale.CHINA.getCountry()));
-
PhoneNumberUtils.formatNumber(num,"CN")
格式化電話號碼 -
DateUtils.getRelativeTimeSpanString(long startTime)
返回 "幾天前"/"xx days ago" 格式的字串 -
android.text.format.Formatter.formatFileSize(Context, long)
方法,用來格式化檔案Size(B → KB → MB → GB); -
Log.getStackTraceString(e)
可以將異常資訊轉換成字串的形式 -
Throwable
類中的getStackTrace()
方法,根據這個方法可以得到函式的逐層呼叫地址,其返回值為StackTraceElement[]
;StackTraceElement
類,其中四個方法getClassName()
,getFileName()
,getLineNumber()
,getMethodName()
在除錯程式列印Log時非常有用;
-
TextUtils
是一個非常好用的工具類,把 List 轉成字串,逗號分隔,逗號分隔的 String 字串,切割成 List ,分別可以用TextUtils
的join
和split
方法。如果要對 List 去重,則可以用Collection
的frequency
方法。 -
按拼音排序
List<String> list = new ArrayList<>(Arrays.asList("翁", "啊", "好", "月")); Log.d(TAG, "before sort: " + list); Collections.sort(list, Collator.getInstance(Locale.SIMPLIFIED_CHINESE));
View相關
-
ViewFlipper,實現多個view的切換(迴圈),可自定義動畫效果,且可針對單個切換指定動畫,如中獎資訊的展示。別人關於ViewFlipper使用的教程
-
view的
isShown
方法,只有當view本身以及它的所有祖先們都是visible
時,isShown()
才返回TRUE
-
android:clipChildren
:是否限制子View在其範圍內,神奇的屬性 -
通過
View.getDrawingCache()
可以獲取截圖,但是需要setDrawingCacheEnabled(true)
頻繁使用可能會oom,還有一種方法直接用canvasBitmap bm = Bitmap.createBitmap((int) (w * scale), (int) (h*scale), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(); canvas.setBitmap(bm);View.draw(canvas);return bm;
-
ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);
用於根據一個起始顏色值和一個結束顏色值以及一個偏移量生成一個新的顏色,分分鐘實現類似於微信底部欄滑動顏色漸變。 -
android:duplicateParentState="true"
,讓子View跟隨其Parent的狀態,如pressed等 -
setError(CharSequence error,Drawable icon)
用於驗證使用者輸入,通常用在EditText中。 -
includeFontPadding="false"
,TextView預設上下是有一定的padding的,有時候我們可能不需要上下這部分留白,加上它即可。 -
TextView.setCompoundDrawablePadding
,程式碼設定TextView的drawable padding。 -
TextView類中的
setTransformationMethod(TransformationMethod)
方法,可用來實現“顯示密碼”,"顯示大寫"功能 -
runOnUiThread
和view.post
都是直接回到主執行緒的方法,不用寫handler,可用來重新整理ui相關操作。 -
android:descendantFocusability
,ListView的item中CheckBox等元素搶焦點導致item點選事件無法響應時,除了給對應的元素設定 focusable,更簡單的是在item根佈局加上android:descendantFocusability="blocksDescendants"
-
View類中的三個方法:
callOnClick(),performClick(),performLongClick()
,用於觸發View的點選事件 ; -
複寫Activity 的
onUserLeaveHint
方法,確保使用者離開介面時能立即暫停介面的一些任務 -
View類中的
getLocationInWindow(int[])
方法和getLocationOnScreen(int[])
方法,獲取View在視窗/螢幕中的位置 -
View類中的
setSelected(boolean)
方法結合android:state_selected=""
用來實現圖片選中效果 -
StaticLayout
是android 中處理文字換行的一個工具類,StaticLayout已經實現了文字繪製換行處理,一般只有在自定義View時遇到長串文字需要換行時用到
public void onDraw(Canvas canvas){ super.onDraw(canvas); TextPaint tp = new TextPaint(); tp.setColor(Color.BLUE); tp.setStyle(Style.FILL); tp.setTextSize(50); String message = "這裡是一個long long long long long long long long long long long long long text,自己看著換行顯示吧,哈 哈"; StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); myStaticLayout.draw(canvas); canvas.restore(); }
-
generateViewId 動態生成控制元件id
my_view.setId(View.generateViewId());
-
把一個view儲存為Bitmap,正常情況下用第一種方法就可以了,但是如果是ScrollView,則必須採用第二種方法
public Bitmap createViewBitmap(View v) { Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); v.draw(canvas); return bitmap; }
public static Bitmap getBitmapByView(ScrollView scrollView) { int h = 0; Bitmap bitmap = null; // 獲取scrollview實際高度 for (int i = 0; i < scrollView.getChildCount(); i++) { h += scrollView.getChildAt(i).getHeight(); scrollView.getChildAt(i).setBackgroundColor( Color.parseColor("#ffffff")); } // 建立對應大小的bitmap bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.RGB_565); final Canvas canvas = new Canvas(bitmap); scrollView.draw(canvas); return bitmap; }
-
tools
標籤可以很好的幫助開發者實時預覽xml的效果,並且執行以後tools標籤的內容不會展示出來.例如
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="這段話只在預覽時能看到,執行以後就看不到了" />
AndroidManifest.xml
android:largeHeap="true" android:excludeFromRecents="true"
資源
Merge
元件相關
-
startActivities(android.content.Intent))
常用於在應用程式中間啟動其他的Activity. -
Activity.recreate ()
強制讓 Activity 重建。 -
ActivityOptions
負責Activity跳轉時的動畫
ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 0, 0, view.getWidth(), view.getHeight()); startActivity(new Intent(MainActivity.this, AnimationActivity.class), opts.toBundle());
Fragment.setArguments getChildFragmentManager()
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //DisplayMetrics{density=3.0, width=1080, height=1920, scaledDensity=3.0, xdpi=428.625, ydpi=427.789}
Resources.getSystem().getDisplayMetrics().density
可以不用 Context 也能獲取螢幕密度哦
-
Fragment類中
當使用add()
+show()
,hide()
跳轉新的Fragment時,舊的Fragment回撥onHiddenChanged()
,不會回撥onStop()
等生命週期方法,而新的Fragment在建立時是不會回撥onHiddenChanged()
show()
,hide()
最終是讓Fragment的ViewsetVisibility(true還是false)
,不會呼叫生命週期;使用
FragmentPagerAdapter
+ViewPager
時,切換回上一個Fragment頁面時(已經初始化完畢),不會回撥任何生命週期方法以及onHiddenChanged()
,只有setUserVisibleHint(boolean isVisibleToUser)
會被回撥,所以如果你想進行一些懶載入,需要在這裡處理。
其它
-
Messenger,AIDL 實現的封裝,比手寫AIDL 更方便。
-
SparseArray
Map的高效優化版本。推薦瞭解姐妹類SparseBooleanArray、SparseIntArray和SparseLongArray -
ActivityManager.getMemoryClass ()
通過這個方法可以知道系統還能給APP分配多少記憶體使用。 -
SystemClock.sleep (long)
用這個方法可以很方便的模擬網路延遲,而且不會丟擲InterruptedException -
UrlQuerySanitizer一個很方便用來處理url連結的工具類
///取name值 UrlQuerySanitizer sanitizer = new UrlQuerySanitizer("http://xxx.com/?name=d"); sanitizer.setAllowUnregisteredParamaters(true); String name = sanitizer.getValue("name");
樣式
為你的app新增預設佈局樣式,比如:每一個控制元件都需要寫width
和height
屬性,然而很多的控制元件的寬高屬性都是wrap_content
,那麼我們可以通過在style檔案新增如下樣式,控制元件的寬高預設都是wrap_content
樣式啦
<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>
Gradle
- versionNameSuffix可以讓你在基於不同構建型別的 manifest 中修改版本名這個屬性,例如,如果需要在在 debug 版本中以”-SNAPSHOT”結尾,那麼就可以輕鬆的看出當前是 debug 版還是 release 版
版本
- .gitignore只能忽略那些原來沒有被track的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore是無效的。那麼解決方法就是先把本地快取刪除(改變成未track狀態),然後再提交:
git rm -r --cached . git add . git commit -m 'update .gitignore'
-
本地生成的git庫要提交remote時,pull報fatal: refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories