字符串相关
格式化字符串,可以使用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
oom有一种偷懒又有效的解决办法,在manifest上加
android:largeHeap="true"
给Activity标签设置了
android:excludeFromRecents="true"
属性后,退出程序后,长按home,该Activity不会在最近的任务列表中显示
资源
-nodpi——在没有特别定义的情况下,很多修饰符(-mdpi,-hdpi,-xdpi等等)都会默认自动缩放 assets/dimensions,有时候我们需要保持显示一致,这种情况下就可以使用 -nodpi。
Merge
此标签可以在另一个布局文件中包含别的布局文件,而不用再新建一个 ViewGroup,对于自定义 ViewGroup 的时候也需要用到;可以通过载入一个带有标签的布局文件来自动定义它的子部件。
组件相关
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
—给 Fragment传参fragment嵌套内部fragment的manager通过
getChildFragmentManager()
获得DisplayMetrics来获取屏幕高度和宽度,此外,还可以通过它获取屏幕密度
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和SparseLongArrayActivityManager.getMemoryClass ()
通过这个方法可以知道系统还能给APP分配多少内存使用。SystemClock.sleep (long)
用这个方法可以很方便的模拟网络延迟,而且不会抛出InterruptedExceptionUrlQuerySanitizer一个很方便用来处理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
作者:waiwaaa
链接:https://www.jianshu.com/p/8a5bf075664c