-
Notifications
You must be signed in to change notification settings - Fork 21
Android 技巧
Space控件是在Android 4.0中加入,是个空白的view,用于进行分隔。我们在组件中加入一下XML代码,布局上下隔出20dip的空隙。
<Space android:layout_width="wrap_content"
android:layout_height="20dip" />
在验证用户输入的时候很棒 在App开发的过程中,有时需要对输入信息做信息进行过滤并提示用户。例如在使用EditText时,用户输入信息有误,友好的交互是提示用户
(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
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));
获取缓存数据文件夹的路径,很简单但是知道的人不多,这个路径通常在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