为了账号安全,请及时绑定邮箱和手机立即绑定

android开发实用小技巧

标签:
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 ,分别可以用 TextUtilsjoinsplit 方法。如果要对 List 去重,则可以用 Collectionfrequency 方法。

  • 按拼音排序

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)方法,可用来实现“显示密码”,"显示大写"功能

  • runOnUiThreadview.post都是直接回到主线程的方法,不用写handler,可用来刷新ui相关操作。

  • android:descendantFocusability,ListView的item中CheckBox等元素抢焦点导致item点击事件无法响应时,除了给对应的元素设置 focusable,更简单的是在item根布局加上android:descendantFocusability="blocksDescendants"

  • View类中的三个方法:callOnClick(),performClick(),performLongClick(),用于触发View的点击事件

  • 复写ActivityonUserLeaveHint方法,确保用户离开界面时能立即暂停界面的一些任务

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

  • View类中的setSelected(boolean)方法结合android:state_selected=""用来实现图片选中效果

  • StaticLayoutandroid中处理文字换行的一个工具类,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 动态生成控件idmy_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的View setVisibility(true还是false),不会调用生命周期;
    使用FragmentPagerAdapter+ViewPager时,切换回上一个Fragment页面时(已经初始化完毕),不会回调任何生命周期方法以及onHiddenChanged(),只有setUserVisibleHint(boolean isVisibleToUser)会被回调,所以如果你想进行一些懒加载,需要在这里处理。

其它

  • MessengerAIDL 实现的封装,比手写 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添加默认布局样式,比如:每一个控件都需要写widthheight属性,然而很多的控件的宽高属性都是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 historiesgit pull origin master --allow-unrelated-histories



作者:waiwaaa
链接:https://www.jianshu.com/p/8a5bf075664c


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消