有时候,我们需要对指定类型文件设定不同样式的icon,与文件扩展名一一对应,获取扩展名方法很笨,但是由于没有相关Api,也只能采用笨方法
获取文件扩展名
/**
* 获取文件格式名
*/
public static String getFormatName(String fileName) {
//去掉首尾的空格
fileName = fileName.trim();
String s[] = fileName.split("\\.");
if (s.length >= 2) {
return s[s.length - 1];
}
return "";
}
原理是,通过“.”来对文件名切分,取数组内最后一个,我们就认为这个就是文件的扩展名,当数组长度小于2时,我们认为它没有扩展名,当未知文件处理,当然还有其他的方法,比如subString
值得注意的是 “.” 在java中属于关键字,需要转义
好,我们拿到扩展名后,为其设置对应的icon就好了,但是(有但是了)文件扩展名不计其数,我们不可能每种类型都对应设置icon,首先美工就得疯掉,那么该怎么办呢?
将格式分类区分
比如 jpg、jpeg、gif 等都是图片,统一规划为 image 类型
为了加强代码的可读性,关键是要加强代码的可扩展性,这里我采用了枚举来进行分类区分,枚举类型如下(我只列出了项目中用到的格式,自行补充并且替换iconId)在使用过程中,只需要在对应类型下补充对应的格式即可
FormatEnum 格式枚举
/**
* Created by MrYan on 2018/9/10.
* 格式枚举
*/
public enum FormatEnum {
//文件夹
FOLDER("folder", R.drawable.normal_dir),
//图片格式
IMG("img", R.mipmap.file_icon_cad, "jpg", "jpeg", "gif", "png", "bmp", "tiff"),
//文本格式
TXT("txt", R.mipmap.file_icon_txt, "txt"),
//文档格式
WORD("word", R.mipmap.file_icon_word, "docx", "dotx", "doc", "dot", "pagers"),
//电子表格
EXCEL("excel", R.mipmap.file_icon_excel, "xls", "xlsx", "xlt", "xltx"),
//ppt
PPT("ppt", R.mipmap.file_icon_ppt, "ppt", "pptx"),
//pdf
PDF("pdf", R.mipmap.file_icon_pdf, "pdf"),
//音频格式
MP3("mp3", R.mipmap.file_icon_mp3, "mp3", "wav", "wma"),
//视频格式
VIDEO("video", R.mipmap.file_icon_video, "avi", "flv", "mpg", "mpeg", "mp4", "3gp", "mov", "rmvb", "mkv"),
//网页格式
HTML("html", R.mipmap.h5, "html"),
//cad
CAD("cad", R.mipmap.file_icon_cad, "dwg","dxf","dwt"),
//ps
PS("ps", R.mipmap.file_icon_psd, "psd", "pdd"),
//max
MAX3D("3DMax", R.mipmap.file_icon_max, "max"),
//压缩包
ZIP("zip", R.mipmap.file_icon_zip, "zip", "jar", "rar", "7z"),
//未知格式
UNKNOWN("unknown", R.mipmap.file_icon_unknown);
private static final String TAG = "FormatEnum";
public String TYPE;
public int ICON;
public String[] FORMATS;
/**
* @param type 文件类型
* @param icon 对应icon
* @param formats 包含格式
*/
FormatEnum(String type, int icon, String... formats) {
this.TYPE = type;
this.ICON = icon;
this.FORMATS = formats;
}
/**
* 通过文件类型获取对应枚举
*
* @param extension 文件扩展名
* @return 文件对应的枚举信息,如果没有,返回未知
*/
public static FormatEnum getFormat(String extension) {
for (FormatEnum format : FormatEnum.values()) {
for (String extend : format.FORMATS) {
if (extend.equalsIgnoreCase(extension)) {
return format;
}
}
}
return UNKNOWN;
}
}
然后,通过封装的工具类调用它
FormatUtils
/**
* Created by MrYan on 2018/9/10.
* 格式工具类,通过文件名获取文件格式
*/
public class FormatUtils {
/**
* 获取文件格式名
*/
public static String getFormatName(String fileName) {
//去掉首尾的空格
fileName = fileName.trim();
String s[] = fileName.split("\\.");
if (s.length > 2) {
return s[s.length - 1];
}
return "";
}
/**
* 获取文件对应icon
*/
public static int getFileIcon(String fileName) {
File file = new File(fileName);
if (file.isDirectory()) {
return FormatEnum.FOLDER.ICON;
}
//获取扩展名并且全部转小写
String extension = getFormatName(fileName).toLowerCase();
if (TextUtils.isEmpty(extension)) {
return FormatEnum.UNKNOWN.ICON;
}
FormatEnum format = FormatEnum.getFormat(extension);
return format.ICON;
}
/**
* 获取文件对应类型
*/
public static String getFileType(String fileName) {
//获取扩展名并且全部转小写
String extension = getFormatName(fileName).toLowerCase();
if (TextUtils.isEmpty(extension)) {
return FormatEnum.FOLDER.TYPE;
}
FormatEnum format = FormatEnum.getFormat(extension);
return format.TYPE;
}
/**
* 通过文件获取icon
*/
public static int getFileIcon(File file) {
return getFileIcon(file.getName());
}
/**
* 通过文件获取格式名
*/
public static String getForamtName(File file) {
return getFormatName(file.getName());
}
/**
* 直接设置icon
*
* @param iv 需要设置icon的View
* @param fileName 文件名
*/
public static void initIcon(ImageView iv, String fileName) {
//如果是图片类型的文件,还需要直接展示图片
if (getFileType(fileName).equalsIgnoreCase(FormatEnum.IMG.TYPE)) {
iv.setImageResource(FormatEnum.IMG.ICON);
ImageLoader.load(iv.getContext(), fileName, iv);
} else {
iv.setImageResource(getFileIcon(fileName));
}
}
}
如此,大功告成