Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 611|回复: 0

开发交流:Android 有图标的资源管理器(一)

[复制链接]

该用户从未签到

发表于 2011-10-24 09:11:23 | 显示全部楼层 |阅读模式
自定义Adapter对象

        前面的范例示范了如何运用ListActivity及java I/O来查找根目录下的所有文件,其中使用了setListAdapter()这个方法来将存放文件信息的ArrayAdapter设置给ListView。

        Android API提供的ArrayAdapter对象只允许存入String数组或List对象,所以在显示文件列表时,只能以一段字符串来显示文件的名称,如果要同时显示文件夹或文件的图标,以及文件名称,甚至是文件类型、大小等信息,则必须自定义一个实现(Implement)Adapter Interface的对象,就可以自定义想要呈现的Layout,达到同时显示图片文件ICON与多个文字信息的效果。

       Android API中提供了BaseAdapter(Android.widget.BaseAdapter)对象,只要继承此对象就可以实现出属于自己的Adapter。本范例将制作一个美化版的文件资源管理器,可依类型来显示文件夹或文件的图标,范例中将一并示范如何制作在手机上打开文件的功能。

        实现此范例时,须先准备文件图标的ICON图片文件,并存放在 /res/drawable/文件夹下,图片文件路径如下:

Java代码: /res/drawable/back01.png:            回到根目录的图标

/res/drawable/back02.png:            回到上一层的图标

/res/drawable/doc.png:                 文件的图标

/res/drawable/folder.png:              文件夹的图标
复制代码效果图:






       程序中使用自定义的MyAdapter来设置显示的数据,传入存储文件名称与文件路径的两个List对象,使用setListAdapter()将数据设置给ListView。

       当用户单击item时,onListItemClick()会被触发,此时,程序会自行判断item是文件夹还是文件。是文件夹的话,就展开下一层的目录;但如果是文件的话,则运行自定义的openFile()。

       在openFile()这个方法中,会先取得文件的MIME TYPE,系统会依传入的MIME TYPE来决定要如何打开文件,如果无法判断,则直接跳出应用程序行表,让用户选择要用哪一个程序来打开。


  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import android.app.ListActivity;
  4. public class EX05_11 extends ListActivity {
  5. /* 变量声明 items:存放显示的名称 paths:存放文件路径 rootPath:起始目录 */
  6. private List<String> items=null;
  7. private List<String> paths=null;
  8. private String rootPath="/";
  9. private TextView mPath;
  10. @Override
  11. protected void onCreate(Bundle icicle) {
  12. super.onCreate(icicle);
  13. /* 加载main.xml Layout */
  14. setContentView(R.layout.main);
  15. /* 初始化mPath,用以显示目前路径 */
  16. mPath=(TextView)findViewById(R.id.mPath);
  17. getFileDir(rootPath);
  18. }
  19. /* 取得文件架构的方法 */
  20. private void getFileDir(String filePath) {
  21. /* 设置目前所在路径 */
  22. mPath.setText(filePath);
  23. items=new ArrayList<String>();
  24. paths=new ArrayList<String>();
  25. File f=new File(filePath);
  26. File[] ffiles=f.listFiles();
  27. if(!filePath.equals(rootPath)) {
  28. /* 第一笔设置为[回到根目录] */
  29. items.add("b1");
  30. paths.add(rootPath);
  31. /* 第二笔设置为[回到上一层] */
  32. items.add("b2");
  33. paths.add(f.getParent());
  34. }
  35. /* 将所有文件加入ArrayList中 */
  36. for(int i=0;i<files.length;i++) {
  37. File file=files;
  38. items.add(file.getName());
  39. paths.add(file.getPath());
  40. }
  41. /* 使用自定义的MyAdapter来将数据传入ListActivity */
  42. setListAdapter(new MyAdapter(this,items,paths));
  43. }
  44. /* 设置ListItem被按下时要做的动作 */
  45. @Override
  46. protected void onListItemClick (ListView l,View v,int position, long id) {
  47. File file=new File(paths.get(position));
  48. if(file.canRead()) {
  49. if (file.isDirectory()) {
  50. /* 如果是文件夹就再执行getFileDir() */
  51. getFileDir(paths.get(position));
  52. }
  53. else {
  54. /* 如果是文件就执行openFile() */
  55. openFile(file);
  56. }
  57. }
  58. else {
  59. /* 跳出AlertDialog显示权限不足 */
  60. new AlertDialog.Builder(this) .setTitle("Message") .setMessage("权限不足!") .setPositiveButton("OK", new DialogInterface.OnClickListener() {
  61. public void onClick(DialogInterface dialog,int which) {
  62. }
  63. }).show();
  64. }
  65. }
  66. /* 在手机上打开文件的方法 */
  67. private void openFile(File f) {
  68. Intent intent = new Intent();
  69. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  70. intent.setAction(android.content.Intent.ACTION_VIEW);
  71. /* 调用getMIMEType()来取得MimeType */
  72. String type = getMIMEType(f);
  73. /* 设置intent的file与MimeType */
  74. intent.setDataAndType(Uri.fromFile(f),type);
  75. startActivity(intent);
  76. }
  77. /* 判断文件MimeType的方法 */
  78. private String getMIMEType(File f) {
  79. String type="";
  80. String ffName=f.getName();
  81. /* 取得扩展名 */
  82. String end=fName.substring(fName.lastIndexOf(".")+1, fName.length()).toLowerCase();
  83. /* 根据扩展名的类型决定MimeType */
  84. if(end.equals("m4a")||end.equals("mp3")||end.equals("mid") ||end.equals("xmf")||end.equals("ogg")||end.equals("wav")) {
  85. type = "audio";
  86. }
  87. else if(end.equals("3gp")||end.equals("mp4")) { type = "video"; } else if(end.equals("jpg")||end.equals("gif")||end.equals("png") ||end.equals("jpeg")||end.equals("bmp")) {
  88. type = "image";
  89. }
  90. else {
  91. /* 如果无法直接打开,就跳出软件列表供用户选择 */
  92. type="*";
  93. }
  94. type += "/*"; return type;
  95. }
  96. }
复制代码







回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:11:26 | 显示全部楼层

Re:开发交

怎么不全?
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 09:11:29 | 显示全部楼层

Re:开发交

介是神马
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 19:19 , Processed in 0.330651 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表