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的切换(循环),可自定义动画效果,且可针对单个切换指定动画,如中奖信息的展示。

  • 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 histories_git pull origin master --allow-unrelated-histories

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

在这里插入图片描述
二、源码解析合集
在这里插入图片描述

三、开源框架合集
在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

猜你喜欢

转载自blog.csdn.net/weixin_43440181/article/details/130017023