Skip to content

Android 技巧

Mr.wu edited this page May 24, 2017 · 10 revisions

Space控件

Space控件是在Android 4.0中加入,是个空白的view,用于进行分隔。我们在组件中加入一下XML代码,布局上下隔出20dip的空隙。

<Space android:layout_width="wrap_content" 
        android:layout_height="20dip" />

TextView.setError()

在验证用户输入的时候很棒 在App开发的过程中,有时需要对输入信息做信息进行过滤并提示用户。例如在使用EditText时,用户输入信息有误,友好的交互是提示用户

TextUtils.isEmpty

(CharSequence str)这个方法是系统为我们提供的一个非常方便的判断一个CharSequence类型的 参数是否为空的方法,这个方法的返回值是一个boolean,当括号内参数为(null)或者("")时,返回true。

android.text.TextUtils这个类就能胜任绝任多数的工作,比如:

public static boolean isEmpty(@Nullable CharSequence str) 这个方法判断字符串非null且非空,在对字符串进行判断时可以不必if(str !=null && str.length() > 0)这样判断。

public static CharSequence concat(CharSequence... text) 字符串连接。有很多字符串,你还在用+拼接或自己new 一个StringBuffer\StringBuilder么?其实这个方法已经帮我们做好了,用StringBuilder实现,进行字符串拼接时可以考虑使用这个方法。而且支持SpannableString。

public static boolean isDigitsOnly(CharSequence str)

android.text.format.DateUtils 这个类是Android提供的格式化日期的工具类。相对于我们经常使用的SimpleDateFormat类来说,DateUtils已经处理好国际化相关的问题,而且还封装了一些很简便的方法。 public static String formatDateTime(Context context, long millis, int flags); 这个方法可以格式化日期和时间,接收三个参数,其中第三个参数flags决定输出后的格式,如果只输出日期的话:DateUtils.formatDateTime(context,millis,DateUtils.FORMAT_SHOW_DATE)如果想输出年或月等等格式的话,就在DateUtils找对应的flags就可以。但是如果想输出年、月、日、星期、日期等多重的结果的组合,可以通过|操作符来运算。

DateUtils.formatDateTime(context, System.currentTimeMillis(),
        DateUtils.FORMAT_SHOW_YEAR | 
                DateUtils.FORMAT_SHOW_DATE |
                DateUtils.FORMAT_SHOW_WEEKDAY |
                DateUtils.FORMAT_SHOW_TIME);

输出的结果:2016年1月16日星期五 12:40

Html.fromHtml()

Android TextView使用HTML处理字体样式、显示图片等

String html="<html><head><title>TextView使用HTML</title></head><body><p><strong>强调</strong></p><p><em>斜体</em></p>"  
                +"<p><a href=\"http://www.dreamdu.com/xhtml/\">超链接HTML入门</a>学习HTML!</p><p><font color=\"#aabb00\">颜色1"  
                +"</p><p><font color=\"#00bbaa\">颜色2</p><h1>标题1</h1><h3>标题2</h3><h6>标题3</h6><p>大于>小于<</p><p>" +  
                "下面是网络图片</p><img src=\"http://avatar.csdn.net/0/3/8/2_zhang957411207.jpg\"/></body></html>";  
          
        tv.setMovementMethod(ScrollingMovementMethod.getInstance());//滚动  
        tv.setText(Html.fromHtml(html));     

PhoneNumberUtils.convertKeypadLettersToDigits顾名思义.将字母转换为数字,类似于T9输入法,

Context.getCacheDir()

获取缓存数据文件夹的路径,很简单但是知道的人不多,这个路径通常在SD卡上(这里的SD卡指的是广义上的SD卡,包括外部存储和内部存储)Adnroid/data/您的应用程序包名/cache/ 下面.测试的时候,可以去这里面看是否缓存成功.缓存在这里的好处是:不用自己再去手动创建文件夹,不用担心用户把自己创建的文件夹删掉,在应用程序卸载的时候,这里会被清空,使用第三方的清理工具的时候,这里也会被清空.

程序都会专门写一个方法来获取缓存地址,如下所示 getCacheDir()方法用于获取/data/data//cache目录 getFilesDir()方法用于获取/data/data//files目录

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据 通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。 而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项

public String getDiskCacheDir(Context context) {  
    String cachePath = null;  
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
            || !Environment.isExternalStorageRemovable()) {  
        cachePath = context.getExternalCacheDir().getPath();  
    } else {  
        cachePath = context.getCacheDir().getPath();  
    }  
    return cachePath;  
}  

可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data//cache 这个路径,而后者获取到的是 /data/data//cache 这个路径。

 ($rootDir)
+- /data                -> Environment.getDataDirectory()
|   |
|   |   ($appDataDir)
|   +- data/com.srain.cube.sample
|       |
|       |   ($filesDir)
|       +- files            -> Context.getFilesDir() / Context.getFileStreamPath("")
|       |       |
|       |       +- file1    -> Context.getFileStreamPath("file1")
|       |   ($cacheDir)
|       +- cache            -> Context.getCacheDir()
|       |
|       +- app_$name        ->(Context.getDir(String name, int mode)
|
|   ($rootDir)
+- /storage/sdcard0     -> Environment.getExternalStorageDirectory()
    |                       / Environment.getExternalStoragePublicDirectory("")
    |
    +- dir1             -> Environment.getExternalStoragePublicDirectory("dir1")
    |
    |   ($appDataDir)
    +- Andorid/data/com.srain.cube.sample
        |
        |   ($filesDir)
        +- files        -> Context.getExternalFilesDir("")
        |   |
        |   +- file1    -> Context.getExternalFilesDir("file1")
        |   +- Music    -> Context.getExternalFilesDir(Environment.Music);
        |   +- Picture  -> ... Environment.Picture
        |   +- ...
        |
        |   ($cacheDir)
        +- cache        -> Context.getExternalCacheDir()
        |
        +- ???
各个路径的特性

各个路径的特性

下面介绍这些路径的特性以及使用中需要注意的细节:

1、根目录($rootDir):

  • 内部存储路径: /data, 通过 Environment.getDataDirectory() 获取
  • 外部存储路径: /storage/sdcard0 (也有类似 /mnt/ 这样的),通过 Environment.getExternalStorageDirectory() 获取
Environment.getDataDirectory(): 
        /data

Environment.getExternalStorageDirectory(): 
        /storage/sdcard0

2、应用数据目录($appDataDir)

  • 内部储存: $appDataDir = $rootDir/data/$packageName,
  • 外部存储: $appDataDir = $rootDir/Andorid/data/$packageName

在这些目录下的数据,在 app 卸载之后,会被系统删除,我们应将应用的数据放于这两个目录中。

3、外部存储中,公开的数据目录。 这些目录将不会随着应用的删除而被系统删除,请斟酌使用

·

Environment.getExternalStorageDirectory(): 
    /storage/sdcard0

// 同 $rootDir
Environment.getExternalStoragePublicDirectory(""): 
    /storage/sdcard0

Environment.getExternalStoragePublicDirectory("folder1"): 
    /storage/sdcard0/folder1

4、应用数据目录下的目录

一般的在 $appDataDir 下,会有两个目录

1、数据缓存:$cacheDir = $appDataDir/cache:

  • -内部存储:Context.getCacheDir(), 机身内存不足时,文件会被删除
  • 外部存储:Context.getExternalCacheDir() 外部存储没有实时监控,当空间不足时,文件不会实时被删除,可能返回空对象
Context.getCacheDir(): 
        /data/data/com.srain.cube.sample/cache

Context.getExternalCacheDir(): 
        /storage/sdcard0/Android/data/com.srain.cube.sample/cache

参考:https://www.liaohuqiu.net/cn/posts/storage-in-android/

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally