安卓笔记

  |   0 评论   |   2,737 浏览

安卓笔记TextUtils.isEmpty(CharSequence str)


使用频率超高的字符串判空方法,返回一个 boolean 值,内部实现的判断条件为:str == null || str.length() == 0。备受开发人员喜爱的一个 if 字符串判断,系统已经帮我们封装过。

Html.fromHtml()


解析 Html 格式的富文本内容,并返回一个带样式的字符串,供 TextView 等控件显示。可以解决一些含超链接、图文混排等格式的富文本内容的显示问题。

DateUtils.formatDateTime()


利用 Android SDK 提供的这个日期工具类可以将 long 类型的毫秒级时间数据格式化成特定显示格式的字符串。通常我们使用 Java SDK 中的 SimpleDateFormat 格式化日期数据,比如 new SimpleDateFormat("yyyy-MM-dd HH:mm").format()DateUtils 的作用就是替我们封装了这个过程。格式化结果与当前设备的本地语言环境有关。这里列举几个常用 format 格式(中文环境下):

  • FORMAT_SHOW_DATE:3月3日

  • FORMAT_SHOW_TIME:10:37

  • FORMAT_SHOW_WEEKDAY:星期五

  • FORMAT_SHOW_YEAR:2017年3月3日

  • FORMAT_NUMERIC_DATE:3/3

  • FORMAT_NO_MONTH_DAY:三月

Formatter.formatFileSize(Context context, long sizeBytes)


格式化文件大小,将字节数据格式化为 B、KB、M 等单位的相应数据。context 参数用于判断返回结果的字符串顺序,right-to-left 还是 left-to-right 形式的。这个工具类免去我们自己转化计算的过程,非常方便,特别适用于应用内文件下载的类似场景。

TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics)


将指定单位的尺寸数据按照当前设备屏幕信息转化为相应的像素值。其中,TypedValue 为第一个参数提供了常用的单位值,比如:

  • COMPLEX_UNIT_PX

  • COMPLEX_UNIT_DIP

  • COMPLEX_UNIT_PT

  • COMPLEX_UNIT_SP

源码如下:

public static float applyDimension(int unit, float value, DisplayMetrics metrics){ 
   switch (unit) {    
   case COMPLEX_UNIT_PX:  
        return value;   
   case COMPLEX_UNIT_DIP:     
        return value * metrics.density;  
   case COMPLEX_UNIT_SP:   
        return value * metrics.scaledDensity;  
   case COMPLEX_UNIT_PT:      
        return value * metrics.xdpi * (1.0f/72); 
   case COMPLEX_UNIT_IN:      
        return value * metrics.xdpi;   
  case COMPLEX_UNIT_MM:      
        return value * metrics.xdpi * (1.0f/25.4f);
 }   
    return 0;                 
}

其实在实际使用过程中,像素值都是 int 整数类型,而该方法返回的是 float 类型,如果直接强制转换的话,会自动舍去小数部分。所以,如果不用该方法的话,通常我们会这么转换:

public static int convertDipToPx(Context context, int dip) {  
   float scale = context.getResources().getDisplayMetrics().density;   
    // 0.5f 用于向上取整
    return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
}

Linkify.addLinks()


我们知道对于 TextView 文本控件中的内容,通过 android:autoLink 属性可以为其添加诸如 web、phone 等固定模版的超链接点击事件。但毕竟系统模版有限,而利用 Linkify.addLinks()方法可以添加一些应用内自定义模版,比如新浪微博中的 "@XXX" 格式的超链接跳转等,都可以通过自定义正则表达式来匹配处理。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)


设置安全窗口,禁用系统截屏。防止 App 中的一些界面被截屏,并显示在其他设备中造成信息泄漏。(常见手机设备系统截屏操作方式为:同时按下电源键和音量键。)

比如支付宝 App 的“向商家付款”的包含付款二维码的界面。(补充说明一点,微信付款界面不是这么做的,采用的是在 onResume() 生命周期方法中实时刷新付款二维码,与支付宝在安全方法采取的手段不同。)

拦截 Back 键,使 App 进入后台而不是关闭

 @Override
  public void onBackPressed() {
    Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
    launcherIntent.addCategory(Intent.CATEGORY_HOME);
    startActivity(launcherIntent);
  }

使用 Back 键返回桌面,但不关闭当前应用,而是使之进入后台,就像按下 Home 键一样。

这个技巧厉害了。通常为了防止出现用户误按 Back 键退出 App 的情况,我们会在应用首页的 Activity 中监听返回键操作,使用 Toast 弱提示甚至 Dialog 强提示的方式给到用户一个再次确认的操作,但无法阻止用户通过返回键逐步关闭应用。

然而,如果用这个方法拦截 App 最后一个 Activity(常见为首页界面),既没有阻碍用户操作(回到桌面),又没有关闭掉我们的应用(后台运行中),间接提高 App 的存活时间,真乃暗度陈仓。并且据我实验,微信、支付宝、微博等 App 都是这么做的,大家不妨一试。

ThumbnailUtils


缩略图工具类,可以根据本地视频文件源、Bitmap 对象生成缩略图,常用的公共静态方法为:

  • createVideoThumbnail(String filePath, int kind)

  • extractThumbnail(Bitmap source, int width, int height)

android:weightSum


用于 LinearLayout 中,用于设置 Children weight 的总比重。在 LinearLayout 的 children 中,我们经常会使用 android:layout_weight 按比例分配容器布局的空间,但有时候不一定会分完。以往,有些朋友可能会使用一个空 放在最后来达到末尾占位效果。如果你知道这个属性的话,就能少写一些代码。

android:descendantFocusability


用于 ViewGroup 中,解决作为 Parent 的 ViewGroup 与 Children View 之间的焦点占用问题。最最常见的使用场景就是 list item 中含有一些点击效果的控件,比如 Button、CheckBox 等,相信大家都遇到过。取值有三种,含义就不用再多说了:

  • afterDescendants

  • beforeDescendants

  • blocksDescendants

android:duplicateParentState


是否将 View 自身的 drawable state 交给直接 parent ViewGroup 控制,值为 boolean 类型。比如有一个 item 布局,item 中有一个 button,如果点击 item layout 时,需要 button 呈现对应的点击效果,就可以在 button 中用到这个属性。不过,从设计的角度来讲,这种场景还是比较少见的。知道有这个属性就好,不推荐这种交互设计。

android:fillViewport


ScrollView 的一个属性,用于设置内容部分是否填满屏幕,主要针对内容不足以填满屏幕的情况。这里推荐一个使用技巧,参考我之前写的文章:Android 日常开发中,两个非常实用的布局技巧

android:adjustViewBounds


使用 ImageView 时,你可能会用 android:scaleType 属性设置图片缩放方式。殊不知,android:adjustViewBounds 属性也能起到类似的效果。但要注意的是,后者需要至少指定 ImageView 宽高中的一个属性,或者 maxHeight 之类的,然后另一个属性随之适配。这个属性用在列表中较为合适,比如 App 中的活动列表页面,图片宽度设置为 match_parent,然后高度设为 wrap_content 使其自适应,这样便能保证从服务获取的高分辨率图片在不同的屏幕中不被拉伸变形。(备注:最好在项目资源文件中放置一个与网络图片相同尺寸的默认图,起到 placeholder 作用,避免图片显示前高度为 0 的较差体验。)

>